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真题
