【发布时间】:2020-10-07 20:51:52
【问题描述】:
这是原始的 MySQL 表:
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
当我使用select Id, Num, row_number() over(partition by Num) from t 时,MySQL 会自动打乱Num 列的顺序。但是,我想保持Num 列顺序不变。
具体来说,理想的输出应该是这样的:
+----+-----+-----+
| Id | Num | row |
+----+-----+-----+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 1 | 1 |
| 6 | 2 | 1 |
| 7 | 2 | 2 |
+----+-----+-----+
如何编写这个 MySQL 查询?
【问题讨论】:
-
您可以按 ID 订购吗?
-
@urlreader 我认为他的意思是每次原始订单转到新的
Num时,row_number()都必须从 1 开始。 -
您是否有另一列可以区分每组行?您可以在分区中使用它。
-
@Barmar 不幸的是,我没有其他可区分的列。
-
您可能不得不回到使用会话变量的旧方法来记住上一行中的
num,以及一个@row_number会话变量,它会根据num已更改。
标签: mysql sql window-functions gaps-and-islands