在SQL中,ROW_NUMBER、RANK和DENSE_RANK都是窗口函数。它们都用于为查询结果集中的行分配一个排名值。
-
ROW_NUMBER(): 返回每个分区中的每一行的唯一排名值。
-
RANK(): 如果有相同的值,则分配相同的排名值,跳过下一个排名值。
-
DENSE_RANK(): 如果有相同的值,则分配相同的排名值,不跳过下一个排名值。
例如,如果我们有以下数据表:
Name | Score |
---|---|
John | 90 |
Peter | 80 |
Sally | 85 |
Mike | 90 |
Mary | 85 |
我们可以使用以下查询来给每个学生分配排名:
SELECT Name, Score,
ROW_NUMBER() OVER (ORDER BY Score DESC) AS RowNumber,
RANK() OVER (ORDER BY Score DESC) AS Rank,
DENSE_RANK() OVER (ORDER BY Score DESC) AS DenseRank
FROM Student
结果如下:
Name | Score | RowNumber | Rank | DenseRank |
---|---|---|---|---|
John | 90 | 1 | 1 | 1 |
Mike | 90 | 2 | 1 | 1 |
Sally | 85 | 3 | 3 | 2 |
Mary | 85 | 4 | 3 | 2 |
Peter | 80 | 5 | 5 | 3 |
在这个例子中,ROW_NUMBER将为每个学生分配一个唯一的排名值,而RANK和DENSE_RANK将为相同的分数分配相同的排名值,不同之处在于DENSE_RANK不跳过下一个排名值。