跳到主要内容

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

七、相关面试题

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

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

交流微信二维码

你可能还想看