如何row_number()mysql中的排名数据集

Posted

技术标签:

【中文标题】如何row_number()mysql中的排名数据集【英文标题】:How to row_number() a ranked dataset in mysql 【发布时间】:2020-09-22 06:43:47 【问题描述】:
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开始。

【问题讨论】:

请将示例数据作为文本添加到问题中.. 你的MySql是什么版本的? 我正在运行 Mysql 8.0 有相同的值吗?哪些价值观? c 和 d 在前一行?还是当前的 c 和以前的 c? 当前 c 和以前的 c 【参考方案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

Demo on 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

【讨论】:

尝试在演示中运行select t.* from mytable t!为什么会有同样的结果?【参考方案2】:

我将使用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 是一个 dbfiddle。

【讨论】:

@PcWang 。 . .我知道。我提供它是因为它是一个更简单的解决方案。

以上是关于如何row_number()mysql中的排名数据集的主要内容,如果未能解决你的问题,请参考以下文章

MySQL实现SQL Server排名函数

mysql实现row_number() 功能

MySql中row_number()rank()dense_rank() 的区别

row_number

ROW_NUMBER()在查询业绩排名中的使用

[HIVE] rank() dense_rank() row_number()的学习