代码之家  ›  专栏  ›  技术社区  ›  I.m.rich

如何基于唯一标识符删除Google BigQuery中的重复行

  •  1
  • I.m.rich  · 技术社区  · 6 年前

    在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。无论我如何更改查询,我都会收到无法识别的列和表的错误。

    显然,我执行了“select into”查询,只需手动设置目标表。我有SQL方面的经验,我知道这个过程是可行的。是否有人有一个语法示例,用于根据BQ的唯一ID删除重复记录的过程?或者是一种可以使其运行的修改方法?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Mikhail Berlyant    6 年前

    所以,诀窍在于 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和值)

    所以,现在,您只需使用上面的选择并将结果插入到新表中,或覆盖原始结果,等等-一次完成!