在Google BigQuery中仅使用ROW_NUMBER()筛选重复的name_org1记录(排除唯一记录)
在Google BigQuery中仅使用ROW_NUMBER()筛选重复的name_org1记录(排除唯一记录)
我明白你现在的困境——用ROW_NUMBER()给重复记录编了号,但就是没法把那些只有单条的name_org1记录剔除掉。核心问题在于,你需要先判断每个name_org1分组的总记录数,才能区分出哪些分组是唯一的(仅1条),哪些是存在重复的(≥2条)。
这里有两种简洁的解决方法,都能帮你实现需求:
方法一:用窗口函数同时计算行号和分组总记录数
这种方法只需要扫描一次表,通过两个窗口函数分别生成行号和分组计数,最后筛选出总记录数大于1的行:
WITH ranked_data AS ( SELECT partner, name_org1, ROW_NUMBER() OVER(PARTITION BY name_org1) AS duplicates, -- 计算每个name_org1分组的总记录数 COUNT(*) OVER(PARTITION BY name_org1) AS total_records FROM `gcp-gfs-datalake-core-prd.sap_p05__saphanadb__views_current.but000` ) SELECT partner, name_org1, duplicates FROM ranked_data -- 只保留分组内记录数≥2的行,也就是排除唯一记录 WHERE total_records > 1;
方法二:先筛选出有重复的name_org1,再关联查询
如果你更习惯用分组聚合的思路,可以先找出所有存在重复的name_org1,再用这个列表去过滤原表,最后添加行号:
WITH duplicate_orgs AS ( SELECT name_org1 FROM `gcp-gfs-datalake-core-prd.sap_p05__saphanadb__views_current.but000` GROUP BY name_org1 -- 只保留出现次数≥2的name_org1 HAVING COUNT(*) > 1 ) SELECT partner, name_org1, ROW_NUMBER() OVER(PARTITION BY name_org1) AS duplicates FROM `gcp-gfs-datalake-core-prd.sap_p05__saphanadb__views_current.but000` -- 仅保留存在重复的name_org1记录 WHERE name_org1 IN (SELECT name_org1 FROM duplicate_orgs);
这两种方法都能达到你的目标:只保留那些有重复的name_org1的所有行,完全排除唯一记录。第一种方法更高效(单表扫描),第二种逻辑更直观,你可以根据自己的习惯选择。
备注:内容来源于stack exchange,提问作者Bryan-Lee Edwards
相关产品推荐
相关产品推荐

