You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:06:02