Есть некоторые проблемы с этим запросом, так как, как сказал @Gordon Linoff в комментарии, некоторые строки могут быть проблемными c, когда более одного значения совпадают.
Поэтому здесь я помещаю свою попытку, которая генерирует нужные вам значения, но также сохраняет старые, поскольку в некоторых случаях трудно понять, когда их хранить, как было сказано ранее.
Все, мы создаем таблицу:
CREATE TABLE `dataset.collapse` (
col_1 INT64,
col_2 INT64,
col_3 INT64,
col_4 INT64,
) as SELECT 4 as col_1, null as col_2, null as col_3, null as col_4 UNION ALL
SELECT 0 as col_1, 1 as col_2, null as col_3, null as col_4 UNION ALL
SELECT null as col_1, 1 as col_2, 2 as col_3, null as col_4 UNION ALL
SELECT null as col_1, null as col_2, 6 as col_3, 7 as col_4 UNION ALL
SELECT 5 as col_1, null as col_2, 6 as col_3, null as col_4
И затем мы запускаем наше решение для этого случая, я использовал функцию IFNULL
, чтобы сохранить только ненулевые значения и INNER JOIN
в качестве условия равных значений :
SELECT
IF
(t1.col_1 IS NULL,
CAST(CONCAT(IFNULL(t1.col_1,
t2.col_1)) AS INT64),
t1.col_1) AS c1,
IF
(t1.col_2 IS NULL,
CAST(CONCAT(IFNULL(t1.col_2,
t2.col_2)) AS INT64),
t1.col_2) AS c2,
IF
(t1.col_3 IS NULL,
CAST(CONCAT(IFNULL(t1.col_3,
t2.col_3)) AS INT64),
t1.col_3) AS c3,
IF
(t1.col_4 IS NULL,
CAST(CONCAT(IFNULL(t1.col_4,
t2.col_4)) AS INT64),
t1.col_4) AS c4
FROM
`project.dataset.collapse` AS t1
INNER JOIN
`project.dataset.collapse` AS t2
ON
t1.col_2 = t2.col_2
OR t1.col_1 = t2.col_1
OR t1.col_3 = t2.col_3
OR t1.col_4 = t2.col_4
GROUP BY
c1,
c2,
c3,
c4
И решение, которое мы получаем, это:
Чтобы удалить старые значения, решение будет быть примерно таким:
SELECT
*
FROM (previous_query)
WHERE
CONCAT(IFNULL(c1,
-1),IFNULL(c2,
-1),IFNULL(c3,
-1),IFNULL(c4,
-1))
NOT IN (
SELECT
CONCAT(IFNULL(col_1,
-1),IFNULL(col_2,
-1),IFNULL(col_3,
-1),IFNULL(col_4,
-1))
FROM
`project.dataset.collapse`
WHERE
CONCAT(IFNULL(col_1,
-1),IFNULL(col_2,
-1),IFNULL(col_3,
-1),IFNULL(col_4,
-1)) = CONCAT(IFNULL(c1,
-1),IFNULL(c2,
-1),IFNULL(c3,
-1),IFNULL(c4,
-1)) ))
Имейте в виду, что это решение также удалит [4 null null null]
строку.
Результат: