row_number、rank、dense_rank的区别
时间: 2024-05-17 09:13:40 浏览: 88
row_number、rank、dense_rank都是窗口函数,可以根据指定的排序规则为每一行生成一个排序值,但它们的计算方式不同。
1. row_number():为每一行生成一个唯一的、连续的排序值,排序值的范围是从1开始递增的。如果有相同的排序值,后面的行会得到更高的排序值。
2. rank():为每一行生成一个排序值,相同的值得到相同的排序值,下一个值的排序值为当前值的排名再加1,下一个值的排名则加2。因此,rank()可能会出现并列排名的情况。
3. dense_rank():与rank()类似,为每一行生成一个排序值,相同的值得到相同的排序值,但是下一个值的排序值为当前值的排名再加1,下一个值的排名也是加1。因此,dense_rank()不会出现并列排名的情况。
举个例子,对于以下数据集:
| id | score |
| -- | ----- |
| 1 | 80 |
| 2 | 90 |
| 3 | 80 |
| 4 | 85 |
使用 row_number() 函数,生成的排序值为:
| id | score | row_number |
| -- | ----- | ----------|
| 1 | 80 | 1 |
| 2 | 90 | 2 |
| 3 | 80 | 3 |
| 4 | 85 | 4 |
使用 rank() 函数,生成的排序值为:
| id | score | rank |
| -- | ----- | ---- |
| 1 | 80 | 1 |
| 3 | 80 | 1 |
| 4 | 85 | 3 |
| 2 | 90 | 4 |
使用 dense_rank() 函数,生成的排序值为:
| id | score | dense_rank |
| -- | ----- | ----------|
| 1 | 80 | 1 |
| 3 | 80 | 1 |
| 4 | 85 | 2 |
| 2 | 90 | 3 |
可以看出,当有并列排名的情况时,rank() 和 dense_rank() 的结果不同。
阅读全文