推荐答案
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 查询。