Опция # 1
CREATE OR REPLACE TABLE `project.dataset.your_table` AS
SELECT * EXCEPT(rn)
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY CallRailCallId ORDER BY CallRailCallId) rn
FROM `project.dataset.your_table`
)
WHERE rn = 1
Опция # 2
CREATE OR REPLACE TABLE `project.dataset.your_table` AS
SELECT row.*
FROM (
SELECT ARRAY_AGG(t ORDER BY CallRailCallId LIMIT 1)[OFFSET(0)] row
FROM `project.dataset.your_table` t
GROUP BY CallRailCallId
)
Как вы могли заметить, вышеупомянутые опции используют DDL
(CREATE TABLE) подход, и здесь можно использовать только один известный (из вашего вопроса) столбец - CallRailCallId
Кроме того, обратите внимание - ORDER BY CallRailCallId
не играет никакой реальной роли, потому что GROUPBY и PARTITION BY находятся в одной и той же области.Но если вы измените поле, это будет контролировать, какую именно строку (из нескольких дубликатов) «выжить» (например, ORDER BY ts DESC
- см. Опцию ниже, чтобы узнать, что может быть ts)
Опция № 3
Эта опция использует DML
(УДАЛИТЬ ОТ), но требует использования дополнительного столбца для использования в качестве прерывателя связей
Например, у вас естьts
Поле TIMESTAMP, и вы хотите, чтобы самая последняя (на основе ts) строка сохранилась
DELETE FROM `project.dataset.your_table`
WHERE STRUCT(CallRailCallId, ts) NOT IN (
SELECT AS STRUCT CallRailCallId, MAX(ts) ts
FROM `project.dataset.your_table`
GROUP BY CallRailCallId
)