FIRST_VALUE 窗口函数详解
一、一句话理解
FIRST_VALUE() 返回当前窗口范围内第一行的指定列值。
二、函数语法
FIRST_VALUE(列名) OVER (PARTITION BY 分组列 ORDER BY 排序列 窗口帧)
三、真实业务场景
场景:每笔订单金额相对于首单的变化
计算用户每笔订单金额与首单金额的差值。
SELECT user_id, order_date, amount,
FIRST_VALUE(amount) OVER (PARTITION BY user_id ORDER BY order_date) AS first_amount,
amount - FIRST_VALUE(amount) OVER (PARTITION BY user_id ORDER BY order_date) AS diff_from_first
FROM orders;
结果:
+----------+------------+--------+--------------+-----------------+
| user_id | order_date | amount | first_amount | diff_from_first |
+----------+------------+--------+--------------+-----------------+
| 1 | 2025-01-05 | 100 | 100 | 0 |
| 1 | 2025-01-15 | 150 | 100 | 50 |
| 1 | 2025-02-03 | 80 | 100 | -20 |
+----------+------------+--------+--------------+-----------------+
每行都能看到"首单金额",方便比较每笔订单相对于首单的消费变化。
四、与 LAST_VALUE / NTH_VALUE 对比
| 函数 | 取值位置 |
|---|---|
| FIRST_VALUE | 窗口第一行 |
| LAST_VALUE | 窗口最后一行(注意帧陷阱!) |
| NTH_VALUE(col, n) | 窗口第 N 行 |
五、常见坑点
坑:FIRST_VALUE 一定是窗口首行,不是分区首行
如果不加 ORDER BY,整个窗口平铺,FIRST_VALUE 返回的是数据扫描到的第一行(不确定)。必须加 ORDER BY 才能保证确定性。
六、面试怎么考
- "怎么比较每笔订单和首单的金额?" → FIRST_VALUE
- "FIRST_VALUE 和 MIN 有什么区别?" → FIRST_VALUE 返回首行的值(可以是任意列),MIN 返回最小值
七、相关面试题
- 09. 新用户首单品类偏好分析 — FIRST_VALUE 首单锚定
- 更多窗口函数面试题 →
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

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