mysql - 如何使用 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 |
解决方案
获得所需输出的一种方法是在数字更改时使用lag
和标记,然后您可以使用此标记进行分区:conditional sum
row_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,它增加了对窗口函数的支持
推荐阅读
- jquery - 延迟功能,直到图像加载 jquery
- c# - 如何将变量传递到 SQL 字符串字段中?
- mysql - laravel 5.8 迁移外键问题
- c# - 如何删除所有注册表项而不会被一个不可删除的键停止?
- java - 我如何创建一种方法来检查帐户中是否有足够的资金允许提款或资金不足
- python-3.x - 在 matplotlib 中缩小图形?
- pygame - Pygame- Screen.blit(source, dest, area) 返回空矩形
- excel - NumberFormat 属性在需要返回格式化日期的函数中未生效
- php - 使用“source”命令获取提供意外输出的变量
- c# - 为什么在静态方法可以是非静态的时候使用它?