在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删除重复记录的过程?或者一种修改它会使它运行的方法?
答案 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并将结果插入到新表中或覆盖原始文件等 - 一次性全部!