SQL Server DENSE_RANK() 函数使用指南

在 SQL Server 中, DENSE_RANK() 函数是一种排名函数,它可为查询结果集中的每个行分配一个排名值。和 RANK() 函数类似, DENSE_RANK() 函数也按照指定的排序规则对查询结果集进行排序,并给每行分配一个排名值。不同的是, DENSE_RANK() 函数会跳过相同的排名值,即使有相同的排名值,也不会留下间隔。这使得 DENSE_RANK() 函数可以生成具有连续排名值的排名列表。

语法

DENSE_RANK() 函数的语法如下:

DENSE_RANK() OVER (
  [ PARTITION BY partition_expression , ... [ n ] ]
  ORDER BY order_expression [ ASC | DESC ] , ... [ n ] )

其中,PARTITION BY 子句指定分组条件,ORDER BY 子句指定排序条件。

使用场景

DENSE_RANK() 函数通常用于以下场景:

  • 排名某个数据集合并保留重复值,同时不留空缺
  • 在给定数据集合中查找某一行的排名
  • 在数据集合中查找某一行的相对排名

示例

假设有如下的 sales 表:

id name amount
1 John 1000
2 Alice 2000
3 Tom 1500
4 Jack 2000
5 Lucy 1500
6 Bob 1000

示例 1

查询 sales 表中每个人的排名,并按照销售额降序排列:

SELECT name, amount, DENSE_RANK() OVER (ORDER BY amount DESC) AS rank
FROM sales;

查询结果如下:

name amount rank
Alice 2000 1
Jack 2000 1
Tom 1500 2
Lucy 1500 2
John 1000 3
Bob 1000 3

示例 2

查询 sales 表中每个人的排名,并按照姓名升序排列:

SELECT name, amount, DENSE_RANK() OVER (ORDER BY name ASC) AS rank
FROM sales;

查询结果如下:

name amount rank
Alice 2000 1
Bob 1000 2
Jack 2000 3
John 1000 4
Lucy 1500 5
Tom 1500 6

结论

DENSE_RANK() 函数是一种非常实用的排名函数,它可以为每个分组内的行分配排名,排名相同的行将获得相同的排名,且没有跳过的排名。与 RANK() 和 ROW_NUMBER() 函数不同,它不会跳过排名,因此它可以为具有相同值的行分配相同的排名。