SQL窗口函数中PARTITION BY与ORDER BY的作用差异疑问
窗口函数加ORDER BY改变统计结果的原因
核心原因是聚合类窗口函数存在默认的窗口帧规则,ORDER BY不只是负责分区内排序,还会触发滑动窗口统计逻辑:
- 当窗口函数仅指定
PARTITION BY team_id无ORDER BY时,窗口统计范围是整个分区,COUNT会计算当前team_id下的所有员工数,也就是你预期的团队总人数。 - 当窗口函数额外指定
ORDER BY employee_id时,数据库会启用默认窗口帧:RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,统计范围限定为「分区内排序后从第一行到当前行」,你得到的结果是累计计数,而非整个团队的总人数。
举个对应你异常结果的示例:假设某团队有3名员工,employee_id分别为1、2、3,加了ORDER BY后的统计结果为:
- employee_id=1:统计到第1行,返回team_size=1
- employee_id=2:统计到前2行,返回team_size=2
- employee_id=3:统计到前3行,返回team_size=3
和你给出的异常输出完全吻合。
优化后的正确写法
由于employee_id是表主键,每行唯一,不需要额外加DISTINCT和GROUP BY,可直接简化为:
SELECT employee_id, COUNT(employee_id) OVER (PARTITION BY team_id) AS team_size FROM employee
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

