如何在mysql中对排名数据集进行排序

如何在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

我的数据集中有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   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;