RANK()
是SQL Server的窗口函数,为结果集中的行生成排名。当出现相同值时,后续排名会跳过被占用的名次,形成自然间隔。与DENSE_RANK()
的关键区别在于是否允许排名值连续。
语法:
RANK() OVER ([PARTITION BY 分组列]ORDER BY 排序列 [ASC|DESC]
)
-
PARTITION BY:按指定列分组后分别计算排名
-
ORDER BY:决定排名的排序规则
例子1:基础排名(自然跳号)
-- 创建学生成绩表
CREATE TABLE ExamScores (Student NVARCHAR(50),Score INT
);INSERT INTO ExamScores VALUES
('张三', 95),
('李四', 88),
('王五', 95),
('赵六', 80);-- 使用RANK()按分数降序排名
SELECT Student,Score,RANK() OVER (ORDER BY Score DESC) AS Rank
FROM ExamScores;
结果:
可以看到rank那一列没有“2”,因为前边有两个“1”,这就是rank函数,会跳过2。
示例2:分组排名(部门内排名)
-- 创建销售数据表
CREATE TABLE ProductSales (Category NVARCHAR(50),Product NVARCHAR(50),Sales INT
);INSERT INTO ProductSales VALUES
('电子产品', '手机', 1200),
('电子产品', '耳机', 800),
('服装', 'T恤', 600),
('服装', '外套', 600);-- 按商品类别分组,组内按销量排名
SELECT Category,Product,Sales,RANK() OVER (PARTITION BY CategoryORDER BY Sales DESC) AS CategoryRank
FROM ProductSales;
何时使用RANK()?
-
需要反映自然名次间隔
例如:奥运会奖牌排名(两个金牌后,下一名是铜牌) -
允许并列但保留原始名次逻辑
例如:考试排名(两人并列第1,下一人直接第3名)