【问题标题】:How to remove duplicate rows in Google BigQuery based on a unique identifier如何根据唯一标识符删除 Google BigQuery 中的重复行
【发布时间】:2018-09-29 05:57:30
【问题描述】:

在 SQL 中,我使用以下代码根据唯一 ID 从表中删除重复项:

1. SELECT Unique_ID INTO holdkey FROM [Origination] GROUP BY Unique_ID HAVING count(*) > 1

2. SELECT DISTINCT Origination.*
INTO holddups
FROM [Origination], holdkey
WHERE [Origination].Unique_ID = holdkey.Unique_ID

3. DELETE Origination 
FROM Origination, holdkey
WHERE Origination.Unique_ID = holdkey.Unique_ID

4. INSERT Origination SELECT * FROM holddups  

第二个过程不适用于 BigQuery。无论我如何更改查询,我都会收到无法识别的列和表的错误。

我显然取出“选择进入”查询并手动设置目标表。我有 SQL 经验,而且我知道该过程有效。有没有人有一个语法示例,用于根据 BQ 的唯一 ID 删除重复记录的过程?或者一种修改它以使其运行的方法?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    所以,诀窍在于这里有正确的SELECT

    以下示例适用于 BigQuery 标准 SQL

    #standardSQL
    SELECT row[OFFSET(0)].* FROM (
      SELECT ARRAY_AGG(t ORDER BY value DESC LIMIT 1) row
      FROM `project.dataset.table_with_dups` t
      GROUP BY id
    )  
    

    您可以使用下面的虚拟数据测试/玩上面的内容

    #standardSQL
    WITH `project.dataset.table_with_dups` AS (
      SELECT 1 id, 2 value UNION ALL SELECT 1,3 UNION ALL SELECT 1,4 UNION ALL
      SELECT 2,5 UNION ALL
      SELECT 3,6 UNION ALL SELECT 3,7 UNION ALL
      SELECT 4,8 UNION ALL
      SELECT 5,9 UNION ALL SELECT 5,10 
    )
    SELECT row[OFFSET(0)].* FROM (
      SELECT ARRAY_AGG(t ORDER BY value DESC LIMIT 1) row
      FROM `project.dataset.table_with_dups` t
      GROUP BY id
    )  
    

    结果为

    Row id  value    
    1   1   4    
    2   2   5    
    3   3   7    
    4   4   8    
    5   5   10   
    

    如您所见,id 留下具有最​​大值的行很容易对表进行重复数据删除。该表中还有多少其他列无关紧要 - 上面仍然有效(它不关心模式而不是 id 和值)

    所以,现在,您可以使用上面的 SELECT 并将结果插入新表或覆盖原始表等 - 一口气!

    【讨论】:

    • 你能澄清一下吗?所有工会的目的是什么?
    • 这只是为了有一些示例数据 - 所以您可以自己运行并查看结果。对于您的用例,您只需要 WITH ... () 下面的 SELECT 语句。更新了答案以使其更清楚 - 如果仍然感到困惑,请告诉我
    • 好的!我唯一的问题是什么是“价值”?该表的大小为 400 列,我可以选择任何作为值吗?它必须是独一无二的吗?我可以选择 ID 作为值吗?谢谢!
    • 这只是一个随意的例子,我让你玩,看看你如何控制哪一行生存。所以在我的例子中,我使用 value 来生存具有最大值的行。在您的示例中,您可以完全忽略ORDER BY value DESC,因此在这种情况下,将选择“随机”行(从那些重复行中删除)。有意义吗?
    • 因此,如果要按照您的确切示例进行操作-您应该使用id 而不是Unique_ID,并且您应该忽略我在上面评论中提到的那个命令。当然,您应该使用正确的表参考。我认为您很可能是 BigQuery 的新手 - 尽量接近我的示例/语法:o)
    猜你喜欢
    • 2015-01-02
    • 2020-04-30
    • 1970-01-01
    • 2020-05-16
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2018-11-16
    相关资源
    最近更新 更多