聚合函数结合窗口函数可在保留每行数据的同时进行分组分析。1. 使用SUM、AVG等配合OVER(PARTITION BY)将分组结果广播到每行,如显示部门总工资;2. 计算个人与组内均值的差值,用于绩效对比;3. 求占比指标,如个人工资占部门总额的比例,需注意数值类型避免整除;4. 结合ORDER BY实现累计计算,如按日期累加收入。核心是聚合函数通过OVER子句实现行级展示组内统计,无需JOIN或子查询,提升效率与可读性。
聚合函数和窗口函数结合使用,可以在保留原始行数据的同时,基于分组聚合结果进行更复杂的分析。关键在于将聚合函数作为窗口函数的一部分,使用 OVER() 子句定义其作用范围。
1. 聚合函数作为窗口函数使用
把 SUM、AVG、COUNT 等聚合函数放在 OVER(PARTITION BY …) 中,就能按组计算聚合值,并广播到每一行。
例如:统计每个部门员工的工资总额,并显示在每行记录中:
SELECT name, dept, salary,
SUM(salary) OVER(PARTITION BY dept) AS total_dept_salary
FROM employees;
这样每行都会显示该员工所在部门的总工资,而不会像 GROUP BY 那样只返回一行。
2. 对比个人与组内平均值
常用于找出哪些员工高于或低于部门平均水平。
SELECT name, dept, salary,
salary – AVG(salary) OVER(PARTITION BY dept) AS diff_from_avg
FROM employees;
这个查询展示每个人工资与部门均值的差额,适合做绩效分析。
3. 计算占比类指标
结合聚合窗口函数可以轻松算出占比,比如某员工工资占部门总工资的比例。
SELECT name, dept, salary,
 >salary * 100.0 / SUM(salary) OVER(PARTITION BY dept) AS percent_of_dept
FROM employees;
注意乘以 100.0 是为了防止整数除法导致小数丢失。
4. 结合排序实现动态累计
在时间序列分析中,常用 SUM 配合 ORDER BY 实现累计求和。
SELECT date, revenue,
SUM(revenue) OVER(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_revenue
FROM daily_sales;
这会逐日累加收入,形成趋势线。加上 PARTITION BY 还可按年/月分区累计。
基本上就这些常见用法。核心是理解:聚合函数 + OVER = 每行都能看到组内汇总信息。这种写法避免了子查询和 JOIN,代码更简洁,性能也通常更好。