SQL Server中DENSE_RANK()函数:简洁处理连续排名
什么是DENSE_RANK?
DENSE_RANK()
是SQL Server中的窗口函数,用于为结果集中的行生成无间隔的连续排名。与RANK()
不同,当遇到相同值时,后续排名不会跳过数字。前一篇已经介绍了rank的用法,这次介绍一下dense_rank。
DENSE_RANK() OVER (
[PARTITION BY 列]
ORDER BY 排序列 [ASC|DESC]
)
-
PARTITION BY:分组计算排名
-
ORDER BY:决定排名顺序
示例1:基础排名(处理相同值)
-- 创建示例表
CREATE TABLE Sales (
Salesperson NVARCHAR(50),
Amount INT
);
INSERT INTO Sales VALUES
('Alice', 2000),
('Bob', 1500),
('Charlie', 2000),
('David', 1800);
-- 使用DENSE_RANK
SELECT
Salesperson,
Amount,
DENSE_RANK() OVER (ORDER BY Amount DESC) AS Rank
FROM Sales;
示例2:分组排名(PARTITION BY)
-- 创建员工表
CREATE TABLE Employees (
Department NVARCHAR(50),
Name NVARCHAR(50),
Salary INT
);
INSERT INTO Employees VALUES
('IT', 'John', 8000),
('IT', 'Jane', 9000),
('HR', 'Mike', 7500),
('HR', 'Emily', 7500);
-- 按部门分组排名
SELECT
Department,
Name,
Salary,
DENSE_RANK() OVER (
PARTITION BY Department
ORDER BY Salary DESC
) AS DeptRank
FROM Employees;
何时使用?
-
需要处理并列排名时保持连续数字
-
例如:成绩排名(允许并列第1名,下一个保持第2名)
-
对比:当需要允许排名间隔时使用
RANK()