PostgreSQL 如何用 window frame clause 定义自定义范围求和-SQL

window frame clause用于定义窗口函数计算范围,默认range按排序值重复包含多行,而rows按物理行数精确控制;实际应优先用rows避免重复键导致的统计偏差。

什么是 window frame clause,它和默认 frame 有什么区别

PostgreSQL 的窗口函数默认使用 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW,也就是“从分区开头到当前行(按 ORDER BY 排序后)所有值求和”。但这个“所有值”可能包含重复排序键——比如多行 order_time = '2024-01-01 10:00',它们会被一起纳入当前行的 frame,导致求和结果跳变。

ROWS frame 才真正按物理行偏移定义范围,比如 ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING 明确取前后固定行数,不受排序键重复影响。实际业务中,滚动平均、近 N 天累计、滑动窗口统计等,几乎都该用 ROWS,而不是依赖默认的 RANGE。

常见错误现象:SUM(val) OVER (ORDER BY ts) 在时间戳有重复时,sum 值突然增大一截,且无法预测跳变点。

如何用 ROWS 定义前 N 行滚动求和

这是最常用场景:对每个时间点,计算它及之前 2 行的 amount 总和。

SELECT
  id,
  ts,
  amount,
  SUM(amount) OVER (
    ORDER BY ts, id
    ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  ) AS sum_3_rows
FROM sales;

关键点:

  • ORDER BY 必须明确、确定(加 id 是为避免 ts 相同时排序不稳定)
  • ROWS BETWEEN 2 PRECEDING AND CURRENT ROW 表示“当前行 + 它前面 2 行”,共 3 行
  • 开头几行会自动截断:第 1 行只有自身,第 2 行有前 1 行 + 自身,第 3 行才满 3 行

如果想强制补零或补 NULL,得额外用 CASE WHEN ROW_NUMBER() OVER (...) 判断,PostgreSQL 不支持 frame 内自动填充。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » PostgreSQL 如何用 window frame clause 定义自定义范围求和-SQL
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001791+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001791+
  • 本周更新: 0+
  • 最后更新: 2026-03-16