BigQuery SQL查询异常:重复值问题排查与解决咨询
问题原因与解决方案
问题原因
你的查询用逗号直接连接两个表,这会产生笛卡尔积——Uber Eats表中的每一行都会和Grubhub表中的每一行进行匹配。哪怕你用了DISTINCT,它是对整个结果行(四个字段组合)去重,而不是单独对Uber_Eats_Slug和uber_formatted_datetime去重。只要Grub_Hub_Slug或grubhub_formatted_datetime有不同值,整行就会被保留,所以你会看到大量重复的Uber相关字段,对应不同的Grubhub字段值。
修正方案
方案1:仅获取Uber Eats的不重复数据
如果你的需求只是拿到不重复的Uber_Eats_Slug和uber_formatted_datetime,完全不需要关联Grubhub表,直接查询Uber的表即可:
SELECT DISTINCT CONCAT(vb_name, b_name) AS Uber_Eats_Slug, FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(timestamp AS TIMESTAMP)) AS uber_formatted_datetime FROM `arboreal-vision-339901.take_home_v2.virtual_kitchen_ubereats_hours` LIMIT 1000;
方案2:关联两个平台的对应厨房数据
如果需要同时获取两个平台对应同一家虚拟厨房的数据,必须添加关联条件,用JOIN替代笛卡尔积,比如通过虚拟厨房的vb_name和b_name来匹配:
SELECT DISTINCT CONCAT(ue.vb_name, ue.b_name) AS Uber_Eats_Slug, CONCAT(gh.vb_name, gh.b_name) AS Grub_Hub_Slug, FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(ue.timestamp AS TIMESTAMP)) AS uber_formatted_datetime, FORMAT_TIMESTAMP('%Y-%m-%d %H:%M', CAST(gh.timestamp AS TIMESTAMP)) AS grubhub_formatted_datetime FROM `arboreal-vision-339901.take_home_v2.virtual_kitchen_ubereats_hours` AS ue JOIN `arboreal-vision-339901.take_home_v2.virtual_kitchen_grubhub_hours` AS gh ON ue.vb_name = gh.vb_name AND ue.b_name = gh.b_name -- 确保是同一家虚拟厨房 GROUP BY Uber_Eats_Slug, Grub_Hub_Slug, uber_formatted_datetime, grubhub_formatted_datetime LIMIT 1000;
注:这里的GROUP BY和DISTINCT作用重复,可去掉其中一个,保留DISTINCT或仅保留GROUP BY即可。
内容的提问来源于stack exchange,提问作者Tejas Mallikarjuna
相关产品推荐
相关产品推荐

