如何在将数据保留在SQL中的同时进行重复数据删除

时间:2020-02-28 03:13:35

标签: sql google-bigquery

我有一个要删除重复数据的数据集,而又不会丢失外键。

这里的结构:

PK1  UUID
PK2  BIGINT
FK1  BIGINT
FK2 BIGINT
DATA1 STRING
DATA2 INTEGER
...
so forth.

PK是组合的PK。两个FK来自两个单独的其他表。
该表中有重复的行。如果PK1和PK2是重复的,则数据字段 重复。 FK是我的问题。

数据如下:

PK1    PK2    FK1    FK2    Data1    Data2    Data3
1      1      1      null   a        b        c
1      1      null   2      a        b        c
1      2      5      null   d        e        f
1      2      null   7      d        e        f

我需要的是:

PK1    PK2    FK1    FK2    Data1    Data2    Data3
1      1      1      2      a        b        c
1      2      5      7      d        e        f

我如何合并这些记录?

谢谢

2 个答案:

答案 0 :(得分:2)

您似乎想要聚合:

select PK1, PK2, max(FK1) as fk1, max(FK2) as fk2,
       Data1, Data2, Data3
from t
group by PK1, PK2, Data1, Data2, Data3;

答案 1 :(得分:1)

以下是BigQuery标准SQL

#standardSQL
SELECT DISTINCT * EXCEPT(FK1_, FK2_) REPLACE(FK1_ AS FK1, FK2_ AS FK2)
FROM (
  SELECT *, 
    MAX(FK1) OVER(PARTITION BY PK1, PK2) FK1_,
    MAX(FK2) OVER(PARTITION BY PK1, PK2) FK2_
  FROM `project.dataset.table`
)

注意:上面的版本仅使用PKi和FKi,并且不知道其他任何列,因此您无需在SELECT语句中全部键入它们

您可以使用问题中的示例数据来测试,玩转上面的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 PK1, 1 PK2, 1 FK1, NULL FK2, 'a' Data1, 'b' Data2, 'c' Data3 UNION ALL
  SELECT 1, 1, NULL, 2, 'a', 'b', 'c' UNION ALL
  SELECT 1, 2, 5, NULL, 'd', 'e', 'f' UNION ALL
  SELECT 1, 2, NULL, 7, 'd', 'e', 'f' 
)
SELECT DISTINCT * EXCEPT(FK1_, FK2_) REPLACE(FK1_ AS FK1, FK2_ AS FK2)
FROM (
  SELECT *, 
    MAX(FK1) OVER(PARTITION BY PK1, PK2) FK1_,
    MAX(FK2) OVER(PARTITION BY PK1, PK2) FK2_
  FROM `project.dataset.table`
)

有输出

Row     PK1     PK2     FK1     FK2     Data1   Data2   Data3    
1       1       1       1       2       a       b       c    
2       1       2       5       7       d       e       f