如何在mysql中对排名数据集进行排序
我的数据集中有3列(a、b、c)。如何在MySQL中添加新的列D?如何在mysql中对排名数据集进行排序,mysql,sql,mysql-workbench,window-functions,gaps-and-islands,Mysql,Sql,Mysql Workbench,Window Functions,Gaps And Islands,我的数据集中有3列(a、b、c)。如何在MySQL中添加新的列D? D按c排序,如果当前c和以前的c具有相同的值,则添加1,否则,从1开始。这是一个间隙和孤岛问题,您希望构建具有相同值的相邻记录组 在这里,最简单的方法可能是使用行号之间的差异来定义组: 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
D按c排序,如果当前c和以前的c具有相同的值,则添加1,否则,从1开始。这是一个间隙和孤岛问题,您希望构建具有相同值的相邻记录组 在这里,最简单的方法可能是使用行号之间的差异来定义组:
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
:
select a, b, c,
row_number() over(partition by a, c, rn1 - rn2 order by b) d
from (
select t.*,
row_number() over(partition by a order by b) rn1,
row_number() over(partition by a, 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
的累积和,然后使用行数()
来定义组:
这似乎是最简单的解决方案
是一个dbfiddle。请将示例数据作为文本添加到问题中。.您的MySql版本是什么?我运行的MySql 8.0是否具有相同的值?哪些价值观?前一行的c和d?或者当前c和上一个c?要运行的当前c和上一个ctry
从演示中的mytable t
中选择t.*!为什么会有同样的结果?@PcWang。我知道。我提供它是因为它是一个更简单的解决方案。
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
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;