You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:33:06