基于Google BigQuery的customer_table去重:获取最新实例记录的SQL方案
在BigQuery中获取每个customer_id的最新记录
核心解决方案
如果你的表没有明确的时间戳字段,我们可以通过窗口函数标记每个customer_id的最后出现记录;如果有时间字段(比如update_time),直接用时间字段排序更准确。
情况1:表无时间戳字段(按记录在表中的最后出现顺序判断“最新”)
WITH ranked_customers AS ( SELECT customer_id, name, ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY (SELECT NULL) DESC -- 按记录存储的倒序取最后一条,若有其他可表示顺序的字段可替换此处 ) AS row_num FROM `customer_data.customer_table` ) SELECT customer_id, name FROM ranked_customers WHERE row_num = 1;
情况2:表有时间戳字段(比如update_time,推荐用这个判断“最新”)
WITH ranked_customers AS ( SELECT customer_id, name, ROW_NUMBER() OVER ( PARTITION BY customer_id ORDER BY update_time DESC -- 按更新时间倒序,取最新的一条记录 ) AS row_num FROM `customer_data.customer_table` ) SELECT customer_id, name FROM ranked_customers WHERE row_num = 1;
你之前方法仅返回4行的可能原因
- 错误使用
GROUP BY customer_id搭配聚合函数(比如MAX(name)):这种方式只会返回字符串排序最大的name,若GROUP BY语句存在语法逻辑错误,还会意外过滤大量数据。 - 排序字段选择错误:比如你之前用
ORDER BY customer_id作为窗口函数的排序规则,由于customer_id本身是重复值,无法区分记录的新旧,甚至会导致部分分组的记录被错误过滤。
结果验证
执行上述SQL后,会为每个唯一的customer_id保留一条最新记录,最终返回24行(对应24个唯一的customer_id)。
内容的提问来源于stack exchange,提问作者Richard Liu
相关产品推荐
相关产品推荐

