LAST_VALUE 窗口函数详解
一、一句话理解
LAST_VALUE() 返回当前窗口范围内最后一行的指定列值。注意:默认窗口帧会导致它"看起来没变",这是窗口函数中最大的陷阱之一。
二、函数语法
LAST_VALUE(列名) OVER (PARTITION BY 分组列 ORDER BY 排序列 窗口帧)
三、帧陷阱详解
这是 LAST_VALUE 最核心、最反直觉的特性。
-- 错误写法(默认帧)
SELECT date, price,
LAST_VALUE(price) OVER (ORDER BY date) AS last_price
FROM stock;
错误结果:
+------------+-------+------------+
| date | price | last_price |
+------------+-------+------------+
| 2025-01-02 | 10 | 10 | ← last_price = 当前行的 price!
| 2025-01-03 | 12 | 12 |
| 2025-01-04 | 8 | 8 |
+------------+-------+------------+
为什么不是 8、8、8(整组最后一行是 8)?
因为默认窗口帧是 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(从分区开始到当前行)。对于每一行,LAST_VALUE 看到的"最后一行"就是当前行自己!所以 last_price = price,看起来像没变。
正确写法——显式扩展窗口帧:
SELECT date, price,
LAST_VALUE(price) OVER (
ORDER BY date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS last_price
FROM stock;
正确结果:
+------------+-------+------------+
| date | price | last_price |
+------------+-------+------------+
| 2025-01-02 | 10 | 8 |
| 2025-01-03 | 12 | 8 |
| 2025-01-04 | 8 | 8 | ← 全是 8,正确!
+------------+-------+------------+
四、口诀
LAST_VALUE 想取真正的最后一行,必须写
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。
五、面试怎么考
- "LAST_VALUE 为什么结果没变?" → 默认帧陷阱,这是经典面试题
- "怎么取每个分组的最后一个值?" → LAST_VALUE + ROWS BETWEEN UNBOUNDED
七、相关面试题
- 05. 查询最近一笔有效订单 — LAST_VALUE 末行取值
- 更多窗口函数面试题 →
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
