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

时间:2018-04-18 21:10:51

标签: google-bigquery

在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删除重复记录的过程?或者一种修改它会使它运行的方法?

1 个答案:

答案 0 :(得分:4)

所以,诀窍是在这里有适当的SELECT

下面的示例适用于BigQuery Standard 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并将结果插入到新表中或覆盖原始文件等 - 一次性全部!