SQL 如何用窗口函数 LAG() 计算上一行差值避免自连接-SQL

LAG()需显式ORDER BY确保逻辑顺序,推荐拼主键防重复;首行差值应依业务定NULL或0,避免COALESCE掩盖语义;单趟扫描通常快于自连接,但无索引排序时性能相近;MySQL强制ORDER BY,PostgreSQL允许但不推荐。

LAG() 怎么写才能正确拿到上一行的值

直接用 LAG(column_name) 就能取上一行,但默认行为是按当前查询的 ORDER BY 排序后取前一行——没写 ORDER BY 会报错或结果不可靠。窗口函数不认物理行序,只认逻辑排序顺序。

常见错误是漏掉 ORDER BY,或者排序字段有重复值又没加唯一性兜底(比如时间戳相同、ID缺失),导致 LAG() 拿到的“上一行”实际是任意一条同序记录。

  • 必须显式写 ORDER BY,例如 ORDER BY created_at, id
  • 如果排序字段可能重复,建议拼上主键(如 id)确保顺序唯一
  • LAG() 第二个参数可设偏移量,默认为 1;第三个参数是缺省值,比如 LAG(amount, 1, 0) 表示首行无上一行时填 0

计算差值时 NULL 怎么处理最稳妥

首行没有“上一行”,LAG() 返回 NULL,直接做减法会让整行结果变 NULL。别依赖 COALESCE() 简单兜底——它掩盖了边界语义:首行差值本就无定义,填 0 或 NULL 是业务选择,不是技术补丁。

  • 明确业务规则:首行是否要显示为 0?还是留空?
  • 若需数值型结果且允许首行为 0,用 COALESCE(LAG(val) OVER (ORDER BY ts), 0)
  • 若想保留语义清晰性,建议让首行保持 NULL,并在应用层判断渲染(比如前端显示 “—”)
  • 避免写成 val - COALESCE(LAG(val), 0):这会让首行算出 val - 0,看似有数,实则逻辑错误

为什么比自连接快,以及什么情况下反而更慢

LAG() 是单趟扫描,执行计划里通常只出现一次表访问;而自连接(如 JOIN ... ON t1.id = t2.id + 1)强制数据库做关联操作,数据量大时容易触发临时表或文件排序。

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

本站指数

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