Ниже для 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