如何在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
相关产品推荐
相关产品推荐

