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

BigQuery SQL去重问题:如何过滤无效重复记录仅保留有效行

问题排查与修正方案

原有SQL问题根因

  • 你当前的INNER JOIN逻辑仅将每组的最大Total值关联到原表,但没有增加过滤条件筛选原表中Total等于分组最大值的行,因此同分组下的所有行都会匹配到分组聚合结果,最终重复返回所有行。
  • 额外注意你原SQL中子查询a的表路径是project_id.backup_dataset.capacity_assortment,聚合子查询的表路径是kohls-bda-prd.backup_dataset.capacity_assortment,如果两个项目ID不一致也可能导致数据匹配异常,建议统一使用同一张表路径。

正确查询方案

方案1:基于原有JOIN逻辑修正

在关联条件中新增Total值匹配逻辑,仅保留有效行:

SELECT a.*
FROM (
    SELECT * 
    FROM `kohls-bda-prd.backup_dataset.capacity_assortment` 
    WHERE DATE(lod_tmst)='2021-11-09'
) a
INNER JOIN (
    SELECT 
        OFC_NBR,
        YEAR,
        DEPT_ID,
        MONTH,
        MAX(Total) AS tot_capc
    FROM `kohls-bda-prd.backup_dataset.capacity_assortment` 
    WHERE DATE(lod_tmst)='2021-11-09'
    GROUP BY OFC_NBR,YEAR,DEPT_ID,MONTH
) b 
ON a.OFC_NBR = b.OFC_NBR 
AND a.YEAR = b.YEAR
AND a.DEPT_ID = b.DEPT_ID
AND a.MONTH = b.MONTH
AND a.Total = b.tot_capc

方案2:更高效的窗口函数写法(推荐)

仅需一次表扫描即可实现需求,性能更优:

WITH ranked_data AS (
    SELECT 
        *,
        ROW_NUMBER() OVER(
            PARTITION BY OFC_NBR, YEAR, DEPT_ID, MONTH 
            ORDER BY Total DESC
        ) AS rn
    FROM `kohls-bda-prd.backup_dataset.capacity_assortment`
    WHERE DATE(lod_tmst)='2021-11-09'
)
SELECT * EXCEPT(rn)
FROM ranked_data
WHERE rn = 1

如果同分组下存在多条Total等于最大值的行需要全部保留,将ROW_NUMBER()替换为RANK()即可

内容的提问来源于stack exchange,提问作者Never_Give_Up

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:54:03