BigQuery左连接取最新时间activity字段的SQL实现请求
BigQuery 左连接获取用户最新活动记录的SQL实现
针对你的需求,这里提供两种在BigQuery中实现的方案,核心都是先筛选出表2中每个userId的最新时间记录,再与表1左连接:
方案1:使用ROW_NUMBER() + 子查询
先通过窗口函数给表2的用户记录按时间降序编号,取编号为1的最新记录,再关联表1:
WITH latest_activity AS ( SELECT userId, activity, time, -- 按用户分组,时间倒序排序,最新记录编号为1 ROW_NUMBER() OVER (PARTITION BY userId ORDER BY time DESC) AS rn FROM 表2 ) SELECT t1.userId, t1.age, la.activity, la.time FROM 表1 t1 LEFT JOIN latest_activity la ON t1.userId = la.userId AND la.rn = 1;
方案2:使用BigQuery专属QUALIFY子句
QUALIFY可以直接在查询中过滤窗口函数的结果,写法更简洁:
SELECT t1.userId, t1.age, t2.activity, t2.time FROM 表1 t1 LEFT JOIN ( SELECT userId, activity, time FROM 表2 -- 直接筛选出每个用户的最新记录 QUALIFY ROW_NUMBER() OVER (PARTITION BY userId ORDER BY time DESC) = 1 ) t2 ON t1.userId = t2.userId;
注意事项
- 确保
time字段为可排序类型(如TIMESTAMP、DATETIME),保证排序逻辑正确; - 若表2中无对应
userId的记录,activity和time字段会返回NULL,符合左连接保留表1全部数据的要求; - 如果同一用户同一时间有多条活动记录,
ROW_NUMBER()会随机取其中一条,若需保留所有同时间的最新记录,可替换为RANK()。
内容的提问来源于stack exchange,提问作者Awssylearn
相关产品推荐
相关产品推荐

