SQL 中的 RANK() 函数用于为结果集中的行分配排名,基于指定的排序条件。以下是详洞历细说明:
核心功能- 排名规则:根据 ORDER BY 子句指定的列或表达式排序,相同值的行获得相同排名,后续排名会跳过重复名次(例如,两个第1名后,下一名为第3名)。
- 分区支持:通过 PARTITION BY 子句可对数据进行分组,每组内独立计算排名。
语法RANK() OVER ( [PARTITION BY partition_expression] ORDER BY order_expression [ASC|DESC])- PARTITION BY(可选):将结果集分组,每组单独计算排名。
- ORDER BY(必需):定义排序依据的列或表达式,决定排名顺序。
使用示例1. 按部门对员工薪资排名SELECT department, name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_in_deptFROM employees;结果示例:
department | name | salary | rank_in_dept-----------+------------+--------+-------------Sales | John Doe | 9000 | 1Sales | Jane Smith | 8000 | 2Marketing | Mike Brown | 8500 | 1Marketing | Lisa Ray | 8500 | 1 -- 相同薪资,排名相同Marketing | Tom Wilson | 7500 | 3 -- 跳过第2名2. 全局排名(无分区)SELECT product_name, sales, RANK() OVER (ORDER BY sales DESC) AS global_rankFROM products;注意事项- 排名跳跃:相同值的行会占用同一排名,后续排名跳搏袜过相应数量。例如,两个第1名后,下一名为第3名。
- 与 DENSE_RANK() 的区别:DENSE_RANK() 不会跳过排名(如两个第1名后,下一名为第2名)。
- 与 ROW_NUMBER() 的区别:ROW_NUMBER() 即使值相同也会分配唯一序号。
适用场景- 生成排行榜(如销售冠军、成绩纳银搜排名)。
- 分析数据分布(如按时间、类别分组排名)。
- 识别重复值(通过排名观察相同值的分布)。
通过灵活使用 PARTITION BY 和 ORDER BY,可以满足多种排名需求。