问题描述
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
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 小提琴。