如何在MySQL中对已排序的数据集进行row_number

问题描述

a   b       c   D
X   201801  1   1
X   201802  0   1
X   201803  0   2
X   201804  1   1
X   201805  0   1
Y   201801  1   1
Y   201802  0   1
Y   201803  0   2
Y   201804  1   1
Y   201805  0   1

这是我的数据集(a,b,c)中的3列。如何在MysqL添加新列D? D由c排序,如果当前c和先前的c具有相同的值,则加1,否则,从1开始。

解决方法

这是一个空白问题,您要在其中构建具有相同值的相邻记录组。

在这里,最简单的方法可能是使用行号之间的差异来定义组:

select a,b,c,row_number() over(partition by a,rn1 - rn2 order by b) d
from (
    select t.*,row_number() over(partition by a order by b) rn1,c order by b) rn2
    from mytable t
) t

Demo on DB Fiddle

a  |      b | c  |  d
:- | -----: | :- | -:
X  | 201801 | 1  |  1
X  | 201802 | 0  |  1
X  | 201803 | 0  |  2
X  | 201804 | 1  |  1
X  | 201805 | 0  |  1
Y  | 201801 | 1  |  1
Y  | 201802 | 0  |  1
Y  | 201803 | 0  |  2
Y  | 201804 | 1  |  1
Y  | 201805 | 0  |  1
,

我将仅使用c的累积总和然后使用row_number()来定义组:

select t.*,row_number() over (partition by a,grp,c order by b) as d
from (select t.*,sum(c) over (partition by a order by b) as grp
      from t
     ) t;

这似乎是最简单的解决方案。

Here是db 小提琴。