首页 > 解决方案 > 如何row_number()mysql中的排名数据集

问题描述

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

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

标签: mysqlsqlmysql-workbenchwindow-functionsgaps-and-islands

解决方案


这是一个间隙和孤岛问题,您希望在其中构建具有相同值的相邻记录组。

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

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

DB Fiddle 上的演示

一个 | 乙 | c | d
:- | -----: | :- | -:
X | 201801 | 1 | 1
X | 201802 | 0 | 1
X | 201803 | 0 | 2
X | 201804 | 1 | 1
X | 201805 | 0 | 1
是 | 201801 | 1 | 1
是 | 201802 | 0 | 1
是 | 201803 | 0 | 2
是 | 201804 | 1 | 1
是 | 201805 | 0 | 1

推荐阅读