在 MySQL 中,ROW_NUMBER() OVER (PARTITION BY num ORDER BY id)
是一个窗口函数的用法
一、ROW_NUMBER()
函数
ROW_NUMBER()
函数用于为结果集的每一行分配一个唯一的连续整数序号。它从 1 开始,按照指定的顺序依次递增。
二、OVER
子句
-
PARTITION BY
子句:PARTITION BY
用于将结果集划分为多个分区。在这个例子中,按照num
列的值进行分区。这意味着具有相同num
值的行将被划分到同一个分区中。- 例如,如果有一个表包含
id
、num
和其他列,并且有一些行具有相同的num
值,那么这些行将在同一个分区内进行编号。
-
ORDER BY
子句:ORDER BY
用于确定在每个分区内为行分配序号的顺序。在这个例子中,按照id
列的值进行升序排序。这意味着在每个分区内,行将根据id
列的值从小到大进行编号。
三、整体解释
ROW_NUMBER() OVER (PARTITION BY num ORDER BY id)
将为每个分区(由相同的num
值确定)内的行按照id
列的升序顺序分配一个连续的序号。
例如,假设有以下数据:
id | num | other_column |
---|---|---|
1 | 10 | value1 |
2 | 10 | value2 |
3 | 20 | value3 |
4 | 20 | value4 |
5 | 30 | value5 |
执行上述查询后,结果可能如下:
id | num | other_column | row_number |
---|---|---|---|
1 | 10 | value1 | 1 |
2 | 10 | value2 | 2 |
3 | 20 | value3 | 1 |
4 | 20 | value4 | 2 |
5 | 30 | value5 | 1 |
在这个结果中,对于num
值为 10 的分区,行按照id
升序排序,分别被分配了序号 1 和 2。对于num
值为 20 的分区,行也按照id
升序排序,被分配了序号 1 和 2。对于num
值为 30 的分区,只有一行,被分配了序号 1。
适用于 :连续登录问题等
相关题目可参考 力扣 高频sql50题 180 连续出现的数字