跳到主要内容

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 返回最小值

七、相关面试题

📱关注公众号

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

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

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

交流微信二维码

你可能还想看