开窗函数ROW_NUMBER() 和dense_rank()区别
时间: 2024-06-12 19:09:39 浏览: 86
开窗函数ROW_NUMBER()和DENSE_RANK()都用于在结果集中排名,不同的是:
1. ROW_NUMBER()根据指定的排序规则,对每一行进行编号,并返回一个唯一的整数值,不会存在相同的值。如果两个或多个行具有相同的排序列值,则第二个行将被赋予一个比第一个行更高的行号。例如:1, 2, 3, 4, 5。
2. DENSE_RANK()也是根据指定的排序规则对每一行进行排名,但是会跳过相同的排序列值,返回不重复的排名值。例如:1, 2, 3, 3, 4。
相关问题
rank 和 row_number 和 DENSE_RANK 的差异
rank、row_number和dense_rank是在SQL中用于排序和排名数据的函数。它们之间的主要区别如下:
1. rank函数:rank函数用于计算每个行在排序结果中的排名,相同的行将会有相同的排名,并且会跳过后续的排名。例如,如果有两个行排名第一,则下一个行将会排名第三。
2. row_number函数:row_number函数分配一个唯一的连续数字给结果集中的每一行,不管是否存在重复行。它不会跳过后续的排名。例如,如果有两个行排名第一,则下一个行将会排名第二。
3. dense_rank函数:dense_rank函数和rank函数类似,但是它不会跳过后续的排名。即使有重复的行,也会按照连续的方式分配排名。例如,如果有两个行排名第一,则下一个行将会排名第二。
简而言之,rank函数在有重复值时会跳过后续的排名,row_number函数不会跳过后续的排名,而dense_rank函数不会跳过后续的排名且在有重复值时也会按照连续的方式分配排名。
row_number rank dense_rank
在SQL中,行号函数(如`row_number()`、`rank()`和`dense_rank()`)用于对表中的每一行分配一个唯一的序号,常用于窗口函数(Window Functions),它们在每个分组的基础上工作,并可以在整个数据集上进行排序。以下是关于这三个函数的简要说明:
1. **row_number()**:这是最基本的行号函数,给每行分配一个连续的唯一整数,从1开始,适用于全表扫描,不会考虑排序。
2. **rank()**:它也是按顺序给行分配序号,如果有相同的值,则会跳过一些行(比如第二名之后会有第三名)。如果两个或更多的值相同,它们都会获得相同的排名,然后继续下一个排名。
3. **dense_rank()**:与`rank()`类似,但是如果有相同的值,会连续编号,不会跳过任何位置。这意味着不会有空白的排名,所有值都是相邻的。
例如,在销售数据中,你可以用这些函数按照销售额排序并获取每个订单的唯一标识符:
```sql
SELECT row_number() OVER (ORDER BY sales DESC) as ranking,
order_id
FROM sales;
```
阅读全文