跳到主要内容

NTH_VALUE 窗口函数详解

一、一句话理解

NTH_VALUE(列, n) 返回当前窗口范围内第 n 行的指定列值(n 从 1 开始)。比 FIRST_VALUE/LAST_VALUE 更灵活——可以取第 2 行、第 5 行、任意行。

二、函数语法

NTH_VALUE(列名, n) OVER (PARTITION BY 分组列 ORDER BY 排序列 窗口帧)

三、真实业务场景

场景:每笔订单与第 2 笔订单的金额对比

SELECT user_id, order_date, amount,
NTH_VALUE(amount, 2) OVER (
PARTITION BY user_id ORDER BY order_date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS second_order_amount
FROM orders;

同样需要注意窗口帧——默认帧下 NTH_VALUE 只能看到当前行及之前的行。如果第 2 行还没出现,会返回 NULL。用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 确保看到整个分区。

四、与 FIRST_VALUE / LAST_VALUE 对比

函数等价写法
FIRST_VALUE(col)NTH_VALUE(col, 1)
LAST_VALUE(col)NTH_VALUE(col, ∞)

NTH_VALUE 是其中最灵活的——想取第几行就取第几行。

五、常见坑点

坑:n 超出窗口范围返回 NULL

如果窗口只有 3 行,NTH_VALUE(col, 5) 返回 NULL。需要确保窗口帧足够大。

七、相关面试题

📱关注公众号

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

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

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

交流微信二维码

你可能还想看