首页 > 解决方案 > 如何使用 row_number() 进行分区而不进行排序?

问题描述

我的桌子看起来像:

表格1

| Id | Num |
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |

我想要'num'列旁边的row_number,但是一旦num改变它的值,row_number就会重置。

我希望我的桌子看起来像:

| Id | Num | row_num |
| 1  | 1   | 1 |
| 2  | 1   | 2 | 
| 3  | 1   | 3 |
| 4  | 2   | 1 |
| 5  | 1   | 1 |
| 6  | 2   | 1 |
| 7  | 2   | 2 |

标签: mysqlsqlrow-number

解决方案


获得所需输出的一种方法是在数字更改时使用lag和标记,然后您可以使用此标记进行分区:conditional sumrow_number

with lagNum as (
  select id, num, Lag(num) over(order by id) as v
  from t
), changed as (
select id, num,
    Sum(case when num = v then 0 else 1 end) over(order by id rows unbounded preceding) as v 
from lagNum
)
select id, num, row_number() over(partition by v order by id) as row_num
from changed

示例小提琴

这确实需要至少 MySql 8,它增加了对窗口函数的支持


推荐阅读