как дедуплицировать, сохраняя данные в SQL - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть набор данных, который я пытаюсь дедуплицировать, не теряя внешние ключи.

Вот структура:

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

как мне сделать sh эти записи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Вы, кажется, хотите агрегацию:

select PK1, PK2, max(FK1) as fk1, max(FK2) as fk2,
       Data1, Data2, Data3
from t
group by PK1, PK2, Data1, Data2, Data3;
1 голос
/ 28 февраля 2020

Ниже для BigQuery Standard 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    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...