Google BigQuery中保留含4种不同服务类型的重复订单记录
BigQuery 筛选恰好包含4种不同服务类型的完整订单记录方案
核心逻辑:先按订单号Order_no分组统计每个订单关联的去重服务类型数量,再保留数量恰好为4的订单对应的所有原始行,提供两种可直接运行的写法:
写法1:窗口函数实现(大表性能更优)
不需要额外关联表,一次扫描就能出结果,适合数据量较大的场景:
SELECT * EXCEPT(service_type_cnt) FROM ( SELECT *, COUNT(DISTINCT Service_type) OVER (PARTITION BY Order_no) AS service_type_cnt FROM `替换为你的lipid表在BigQuery中的完整路径` ) WHERE service_type_cnt = 4
语法说明:
EXCEPT(service_type_cnt)会把统计用的临时计数字段从最终结果里剔除,返回和原表结构完全一致的符合条件的记录。
写法2:子查询关联实现(逻辑更直观)
先筛出符合要求的订单号,再关联捞取对应所有行,适合SQL新手理解逻辑:
SELECT * FROM `替换为你的lipid表在BigQuery中的完整路径` WHERE Order_no IN ( SELECT Order_no FROM `替换为你的lipid表在BigQuery中的完整路径` GROUP BY Order_no HAVING COUNT(DISTINCT Service_type) = 4 )
注意事项
- 统计时使用
COUNT(DISTINCT Service_type)是为了兼容同一订单下重复录入相同服务类型的脏数据场景;如果业务规则明确保证同一个Order_no下不会出现重复的Service_type,可以替换为COUNT(*),统计速度会更快。 - 运行前需要把SQL里的表路径占位符,替换为你自己项目下lipid表的实际地址,格式为
项目名.数据集名.lipid。
内容的提问来源于stack exchange,提问作者Abo7aneen
相关产品推荐
相关产品推荐

