RANK()窗口函数结合聚合函数时结果行数不符预期的咨询
窗口函数RANK()仅返回一行的原因解析
核心逻辑:窗口函数不替代分组聚合
你遇到的问题根源是混淆了窗口函数和聚合函数的作用边界:
- 窗口函数的核心是对输入结果集的每一行,按规则计算额外的列值,它不会改变输入结果集的行数。
- 如果你的查询里使用了
COUNT()这类聚合函数但未加GROUP BY project_id,聚合函数会将整个表的数据合并为一行(全局统计),此时窗口函数只能基于这唯一的一行数据计算,自然只返回一行结果。
直观对比示例
假设关联后的项目-员工数据如下:
| project_id | employee_id |
|---|---|
| 1 | 101 |
| 1 | 102 |
| 2 | 103 |
错误查询(无GROUP BY)
SELECT project_id, COUNT(employee_id) AS emp_count, RANK() OVER(ORDER BY COUNT(employee_id) DESC) AS project_rank FROM project;
这个查询中,COUNT(employee_id)是全局聚合,直接把所有行合并成一行(project_id取第一行的1,emp_count为3),窗口函数只能计算这一行的排名,最终结果仅一行。
正确查询(加GROUP BY)
SELECT project_id, COUNT(employee_id) AS emp_count, RANK() OVER(ORDER BY COUNT(employee_id) DESC) AS project_rank FROM project GROUP BY project_id;
GROUP BY project_id先按项目分组,得到两行数据(project_id=1的emp_count=2,project_id=2的emp_count=1),窗口函数再基于这个两行的结果集计算排名,就能得到预期的两个项目的排名结果。
关于移除PARTITION BY仍只有一行的说明
移除PARTITION BY后,窗口函数会基于整个结果集计算排名,但如果原始查询因为未分组已经聚合成一行,窗口函数的计算对象还是只有一行,所以结果不会变化。
内容的提问来源于stack exchange,提问作者Peter Thai
相关产品推荐
相关产品推荐

