一、DENSE_RANK()
在SQL Server中,可以使用`DENSE_RANK() `函数与`OVER`子句一起使用来为结果集中的行分配一个密集的排名。一般的语法如下:
DENSE_RANK() OVER ([PARTITION BY <列名> ORDER BY <列名>])
下面是一个示例,演示如何在SQL Server中使用`DENSE_RANK()`函数:
sql
SELECT columnA ,columnB
,DENSE_RANK() OVER (ORDER BY columnB DESC) AS DENSE_RANK
FROM Sales;
- 在示例中,`DENSE_RANK()`函数为`columnB`列中的值分配了一个密集的排名,并将结果作为`Rank`列返回。

二、PARTITION BY子句
如果要按照特定的列进行分组,并在每个分组内使用`DENSE_RANK()`函数,可以使用`PARTITION BY`子句:
sql
SELECT columnA ,columnB ,columnC
,DENSE_RANK() OVER (PARTITION BY columnA ORDER BY columnC DESC) AS DENSE_RANK
FROM Sales;
在这个示例中,`DENSE_RANK()`函数将根据`columnA`列分组,并为每个分组内的`columnC`列的值分配一个密集的排名。
三、排名窗口函数
- ROW_NUMBER():为结果集中的每一行分配一个唯一的连续数字,通常用于分页查询
- RANK():为结果集中的每一行分配一个排名,相同值的行会有相同的排名,排名之间会有间隔。
- DENSE_RANK():与RANK()类似,但排名之间不会有间隔,即相同值的行会有相同的排名,并且排名是连续的。
四、DENSE_RANK() 与 RANK() 的区别
| 函数 | 相同值排名 | 排名间隔 |
|---|---|---|
RANK() |
相同 | 有间隔(如 1, 1, 3) |
DENSE_RANK() |
相同 | 无间隔(如 1, 1, 2) |
五、实例
sql
WITH
SalesData AS (
SELECT N'华东区' AS [部门] ,N'张三' AS [销售员] ,50000 AS [营业额] UNION ALL
SELECT N'华东区' AS [部门] ,N'李四' AS [销售员] ,50000 AS [营业额] UNION ALL
SELECT N'华东区' AS [部门] ,N'王五' AS [销售员] ,45000 AS [营业额] UNION ALL
SELECT N'华北区' AS [部门] ,N'赵六' AS [销售员] ,60000 AS [营业额] UNION ALL
SELECT N'华北区' AS [部门] ,N'孙七' AS [销售员] ,55000 AS [营业额] UNION ALL
SELECT N'华北区' AS [部门] ,N'周八' AS [销售员] ,55000 AS [营业额] UNION ALL
SELECT N'华南区' AS [部门] ,N'吴九' AS [销售员] ,48000 AS [营业额] UNION ALL
SELECT N'华南区' AS [部门] ,N'郑十' AS [销售员] ,48000 AS [营业额] UNION ALL
SELECT N'华南区' AS [部门] ,N'钱十一' AS [销售员] ,42000 AS [营业额] UNION ALL
SELECT N'华南区' AS [部门] ,N'陈十二' AS [销售员] ,40000 AS [营业额]
)
SELECT [部门] ,[销售员] , [营业额]
,DENSE_RANK() OVER (ORDER BY [营业额] DESC) AS DENSE_RANK_全局排名
,DENSE_RANK() OVER (PARTITION BY [部门] ORDER BY [营业额] DESC) AS DENSE_RANK_部门内排名
,ROW_NUMBER() OVER (ORDER BY [营业额] DESC) AS ROW_NUMBER_全局排名
,ROW_NUMBER() OVER (PARTITION BY [部门] ORDER BY [营业额] DESC) AS ROW_NUMBER_部门内排名
FROM SalesData;
