首页/数据/SQL 速查/LAST_VALUE 与默认帧的坑
本包目录(311 条)
查询基础33 条连接与子查询40 条
聚合与窗口函数54 条
函数速查60 条变更与事务52 条性能与执行计划72 条

LAST_VALUE 与默认帧的坑

LAST_VALUE 默认帧是“分区起点到当前行”,直接写会得到当前行值;要取分区最后一行必须显式扩展帧到分区结尾。

SQL 速查数据更新于 2026-10-12

错误直觉与正确写法

错误直觉与正确写法
-- 直觉上想要“该用户最后一单时间”,实际拿到当前行
SELECT user_id, created_at,
       LAST_VALUE(created_at) OVER (
           PARTITION BY user_id ORDER BY created_at
       ) AS wrong_last
FROM orders;

-- 正确:帧扩展到分区结尾
SELECT user_id, created_at,
       LAST_VALUE(created_at) OVER (
           PARTITION BY user_id ORDER BY created_at
           ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
       ) AS real_last
FROM orders;
默认帧有 ORDER BY 时为 RANGE UNBOUNDED PRECEDING AND CURRENT ROW
修正显式写 ROWS BETWEEN … AND UNBOUNDED FOLLOWING
相关FIRST_VALUE 默认行为符合直觉,LAST_VALUE 不符合

易错点

  • LAST_VALUE 是窗口函数里最容易踩坑的一个:不显式写帧结果几乎总是当前行
  • 用 MAX() OVER (PARTITION BY …) 往往比 LAST_VALUE 更直观,按场景选择

数据来源与参考

  • MySQL 8.0 Reference Manual · LAST_VALUE
  • PostgreSQL Documentation · Window Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌