根据条件对 BigQuery 中的行进行重复数据删除

Posted

技术标签:

【中文标题】根据条件对 BigQuery 中的行进行重复数据删除【英文标题】:Deduplicating rows in BigQuery based on condition 【发布时间】:2020-03-02 13:04:14 【问题描述】:

我目前正在尝试对我的一张表在 Google BigQuery 中的行进行重复数据删除。基本上,我有一个表,其中包含除一列之外的重复值的基本行。一个例子是:

请注意,除“广告组名称”列外,所有列都是相同的。我想做的是:如果所有列相同但列广告组名称不同,则保留单行(哪一行无关紧要) >.

我正在考虑创建分区并使用排名函数来表示该分区内的不同值。比如:

RANK() OVER (PARTITION BY Adgroup ID, date, Sales, Cost ORDER BY Ad group name) AS rank

理论上(呵呵)这应该会导致:

使用它,我可以使用WHERE Rank = 1 过滤一个新的子查询。在这种情况下,这将删除所有重复的行。

但是,我发现 BigQuery 不支持使用 FLOAT64 进行分区,因此我的解决方案不起作用。另外,我认为有更好的方法可以做到这一点,但我很难找到如何做到这一点。我可以专门利用 BigQuery 中的哪个功能?

【问题讨论】:

【参考方案1】:

您可以为此使用group by

select Adgroup ID, date, Sales, Cost, any_value(ad_group_name)
from t
group by Adgroup ID, date, Sales, Cost;

【讨论】:

【参考方案2】:

对于这种情况有多种可能的解决方案。 一个使用partition byanalytic function,另一个使用group byARRAY_AGG()

(避免GROUP BYany_value 的可能解决方案)

    分析功能ROW_NUMBER
WITH
org_table AS (
    SELECT 15840 as AdGroupID, '22-1-2019' as AdDate, 'TVs' as AdGroupName, 800 as Sales, 200 as Cost
    UNION ALL SELECT 15840 as AdGroupID, '22-1-2019' as AdDate, 'Televisions' as AdGroupName, 800 as Sales, 200 as Cost
)
SELECT *
FROM org_table
WHERE TRUE
QUALIFY ROW_NUMBER() OVER (PARTITION BY AdgroupID ORDER BY AdDate DESC) = 1
;
    GROUP BYAGG_ARRAY
WITH
org_table AS (
    SELECT 15840 as AdGroupID, '22-1-2019' as AdDate, 'TVs' as AdGroupName, 800 as Sales, 200 as Cost
    UNION ALL SELECT 15840 as AdGroupID, '22-1-2019' as AdDate, 'Televisions' as AdGroupName, 800 as Sales, 200 as Cost
)
SELECT
    AdgroupID,  -- primary key
    ARRAY_AGG(
        STRUCT(AdDate, AdGroupName, Sales, Cost)
        ORDER BY AdGroupName ASC LIMIT 1
    )[OFFSET(0)].*
FROM org_table
GROUP BY AdgroupID
;

【讨论】:

以上是关于根据条件对 BigQuery 中的行进行重复数据删除的主要内容,如果未能解决你的问题,请参考以下文章

根据列中的条件对数据框中的行进行子集/过滤

根据 3 到 4 个条件对数据库表中的行进行计数和分组查询

case 语句中的多个条件重复表中的行

Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]

根据条件从 r 中的多列中删除重复的行

如何在视图或计划查询之间进行选择,以对通过 Stitch 导入的 BigQuery 表进行重复数据删除?