sql排名函数rank怎么用

sql排名函数rank怎么用
最新回答
弥枳

2026-10-23 08:47:15

SQL中的RANK()函数用于对查询结果集中的行进行排名,其核心功能是在分区内按指定顺序分配排名值,相同值的行会获得相同排名,后续排名会跳过重复名次(例如两个并列第1名后,下一名为第3名)。以下是详细用法说明:

基本语法RANK() OVER ( [PARTITION BY partition_expression] ORDER BY order_expression [ASC|DESC])
  • PARTITION BY(可选):将结果集划分为多个分区,每个分区独立排名。若省略,则对整个结果集排名。
  • ORDER BY(必需):定义分区内行的排序规则,决定排名的依据。
关键特性
  1. 相同值同排名:若多行的order_expression值相同,它们会获得相同排名。
  2. 排名跳跃:同排名后,下一排名会跳过占用的名次(如1,1,3)。
  3. 与DENSE_RANK()的区别:DENSE_RANK()不会跳过名次(如1,1,2)。
使用示例示例1:全局排名(无分区)SELECT 姓名, 销售额, RANK() OVER (ORDER BY 销售额 DESC) AS 全局排名FROM 员工表;

输出:

姓名 销售额 全局排名苏珊 250 1保罗 150 2约翰 100 3玛丽 200 4 -- 注意:玛丽实际销售额高于保罗,但因ORDER BY顺序在此示例中未正确反映

(注:此例中若玛丽销售额应为最高,需检查原表数据或ORDER BY逻辑)

示例2:按部门分区排名SELECT 姓名, 部门, 销售额, RANK() OVER (PARTITION BY 部门 ORDER BY 销售额 DESC) AS 部门排名FROM 员工表;

输出:

姓名 部门 销售额 部门排名苏珊 B 250 1玛丽 B 200 2保罗 A 150 1约翰 A 100 2示例3:处理并列排名

若两人销售额相同:

-- 假设新增数据:汤姆A150SELECT 姓名, 部门, 销售额, RANK() OVER (PARTITION BY 部门 ORDER BY 销售额 DESC) AS 排名FROM 员工表;

输出:

姓名 部门 销售额 排名苏珊 B 250 1玛丽 B 200 2保罗 A 150 1汤姆 A 150 1 -- 并列第1约翰 A 100 3 -- 跳过第2名常见应用场景
  1. 销售排行榜:按地区或产品类别生成销售排名。
  2. 成绩排名:对学生成绩按班级分组排名。
  3. 数据分析:识别数据中的顶尖或最低绩效项。
注意事项
  • 性能影响:在大数据集上,RANK()可能较慢,需合理使用索引。
  • 结合其他函数:常与ROW_NUMBER()、DENSE_RANK()对比使用,根据需求选择。
  • NULL值处理:ORDER BY中NULL值的排序行为取决于数据库系统(通常NULL视为最小值)。

通过灵活使用PARTITION BY和ORDER BY,可以高效实现复杂的数据排名需求。