首页 > 数据库 > SQL > 正文

SQL 聚合函数和窗口函数怎么结合使用?

冰川箭仙
发布: 2025-09-22 18:10:02
原创
655人浏览过
聚合函数结合窗口函数可在保留每行数据的同时进行分组分析。1. 使用SUM、AVG等配合OVER(PARTITION BY)将分组结果广播到每行,如显示部门总工资;2. 计算个人与组内均值的差值,用于绩效对比;3. 求占比指标,如个人工资占部门总额的比例,需注意数值类型避免整除;4. 结合ORDER BY实现累计计算,如按日期累加收入。核心是聚合函数通过OVER子句实现行级展示组内统计,无需JOIN或子查询,提升效率与可读性。

sql 聚合函数和窗口函数怎么结合使用?

聚合函数和窗口函数结合使用,可以在保留原始行数据的同时,基于分组聚合结果进行更复杂的分析。关键在于将聚合函数作为窗口函数的一部分,使用 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. 计算占比类指标

结合聚合窗口函数可以轻松算出占比,比如某员工工资占部门总工资的比例。

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

阿里云-虚拟数字人 2
查看详情 阿里云-虚拟数字人

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,代码更简洁,性能也通常更好。

以上就是SQL 聚合函数和窗口函数怎么结合使用?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号