You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在BigQuery SQL中使用LAG函数按条件获取分组首值(替代关联查询实现)

使用LAG函数获取每个用户的首个Session ID

要实现你想要的效果——为每个customer_id的所有行返回其rn=1对应的session_id,其实**FIRST_VALUE窗口函数是更直接的选择**,不过既然你明确要求用LAG函数,我们可以通过动态偏移量的方式来实现。

方法说明

核心思路是:对于每个用户的行,当rn=1时直接取当前的session_id;当rn>1时,利用LAG函数向前偏移rn-1行(刚好定位到该用户rn=1的行),从而获取对应的session_id。

实现代码

SELECT
    customer_id,
    session_id,
    order_id,
    date_key,
    rn,
    CASE
        WHEN rn = 1 THEN session_id
        ELSE LAG(session_id, rn - 1) OVER (PARTITION BY customer_id ORDER BY rn)
    END AS firstSession
FROM table1
ORDER BY customer_id, rn;

为什么这个方法有效?

  • 按customer_id分区,确保我们只在同一个用户的行范围内计算。
  • 按rn升序排序,保证行的顺序和row_number()生成的顺序一致。
  • 对于rn>1的行,rn-1刚好是到该用户rn=1行的偏移量,LAG(session_id, rn-1)会精准取到该行的session_id。

补充:更简洁的替代方案(用FIRST_VALUE)

如果不限制必须用LAG,FIRST_VALUE会更简洁高效,因为它直接取分区内的第一个值:

SELECT
    *,
    FIRST_VALUE(session_id) OVER (PARTITION BY customer_id ORDER BY rn) AS firstSession
FROM table1
ORDER BY customer_id, rn;

这个写法和你的关联查询结果完全一致,而且性能通常更好,因为不需要额外的CTE和关联操作。


内容的提问来源于stack exchange,提问作者gndps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:47:35