【问题标题】:How to incrementally count the number of repeated instances如何增量计算重复实例的数量
【发布时间】:2021-01-29 06:03:54
【问题描述】:

我想增量计算表中重复实例的数量,所以如果我有这样的表:

id   | name  | status |
-----------------------
1    | John  |    1   | 
2    | Jane  |    1   |
4    | John  |    1   |
5    | John  |    1   |
6    | Jane  |    1   |
7    | John  |    1   |

使用列“名称”作为参考,输出将是

id   | name  | status | count |
------------------------------
1    | John  |    1   |   1   |
2    | Jane  |    1   |   1   |
4    | John  |    1   |   2   |
5    | John  |    1   |   3   |
6    | Jane  |    1   |   2   |
7    | John  |    1   |   4   |

DBMS 实现是 MySQL,版本 5.6

【问题讨论】:

  • DBMS 实现是 MySQL 不够。版本?
  • 对不起,我忘了说,我使用的是 MySQL 5.6

标签: mysql sql subquery window-functions mysql-5.6


【解决方案1】:

在 MySQL 5.x 中,窗口函数不可用,一个选项使用相关子查询:

select t.*,
    (
        select count(*)
        from mytable t1
        where t1.name = t.name and t1.id <= t.id
    ) rn
from mytable t

您也可以使用用户变量来执行此操作:

select t.*,
    case when @name = (@name := name)
        then @rn := @rn + 1
        else @rn := 1
    end as rn
from (select * from mytable order by name, id) t
cross join (select @name := null, @rn := 0) x

这两种方法各有利弊。第二个解决方案比第一个解决方案在大型数据集上的扩展性更好,但是用户变量在 MySQL 中很棘手,现在正式计划在未来的版本中弃用。

【讨论】:

    【解决方案2】:

    只需使用row_number():

    select t.*, row_number() over (partition by name order by id) as count
    from t
    order by id;
    

    【讨论】:

      【解决方案3】:
      SELECT t1.id, t1.name, t1.status, COUNT(*) `count`
      FROM tablename t1
      JOIN tablename t2 USING (name)
      WHERE t1.id >= t2.id
      GROUP BY t1.id, t1.name, t1.status
      ORDER BY t1.id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        • 2017-06-30
        • 2023-03-26
        相关资源
        最近更新 更多