如何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中的排名数据集的主要内容,如果未能解决你的问题,请参考以下文章