推荐答案
SELECT employee_id, department_id, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_in_department FROM employees;
本题详细解读
什么是窗口函数?
窗口函数(Window Function)是 SQL 中一种强大的工具,允许你在不改变行数的情况下,对一组行进行计算。与聚合函数不同,窗口函数不会将多行合并为一行,而是为每一行返回一个值。
窗口函数的基本语法
function_name (expression) OVER ( [PARTITION BY partition_expression] [ORDER BY sort_expression] [frame_clause] )
- function_name: 窗口函数的名称,如
RANK()
,ROW_NUMBER()
,SUM()
,AVG()
等。 - expression: 需要计算的列或表达式。
- PARTITION BY: 将数据分组,类似于
GROUP BY
,但不会减少行数。 - ORDER BY: 指定窗口内的排序方式。
- frame_clause: 定义窗口的范围,通常用于滑动窗口计算。
示例解析
在推荐答案中,我们使用了 RANK()
窗口函数来计算每个部门内员工的薪资排名。
- PARTITION BY department_id: 将数据按
department_id
分组,每个部门内的员工单独计算排名。 - ORDER BY salary DESC: 在每个部门内,按薪资从高到低排序。
- RANK(): 计算每个员工在其部门内的排名。
其他常用窗口函数
- ROW_NUMBER(): 为每一行分配一个唯一的序号。
- DENSE_RANK(): 类似于
RANK()
,但不会跳过重复的排名。 - SUM(): 计算窗口内某一列的总和。
- AVG(): 计算窗口内某一列的平均值。
- LEAD() / LAG(): 获取当前行前后某一行的值。
窗口函数的应用场景
- 排名计算: 如计算销售排名、薪资排名等。
- 累计计算: 如计算累计销售额、累计利润等。
- 滑动窗口计算: 如计算移动平均值、移动总和等。
- 前后值比较: 如比较当前行与前一行的差值。
窗口函数在数据分析、报表生成等场景中非常有用,能够简化复杂的 SQL 查询。