我有一个表,其中包含> 70M的数据行和2M的重复项。我想通过保留最近的原始行来清除重复项。
我从这里找到了一些解决方案-link
其中,解决方案只是清除重复项,而不保留重复项中的最新数据。
这是另一个常见的解决方案:
;WITH cte
AS (SELECT Row_number() OVER (partition BY id ORDER BY
updatedAt
DESC,
status DESC) RN
FROM MainTable)
DELETE FROM cte
WHERE RN > 1
但是BigQuery不支持它。
答案 0 :(得分:1)
这是解决方法,它将唯一的行和最近的原始行替换为现有表。
CREATE OR REPLACE TABLE
`MainTable` AS
SELECT
id,
acctId,
appId,
createdAt,
startTime,
subAcctId,
type,
updatedAt,
userId
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC -- the first row among duplicates will be kept, other rows will be removed
) RN
FROM
`MainTable`)
WHERE
RN = 1
由于我们没有选择删除特定列的选项,因此在替换现有表时必须选择所需的列。
希望这对某人有帮助。如果您有更好的解决方案,请分享。
答案 1 :(得分:0)
以下是用于BigQuery标准SQL
CREATE OR REPLACE TABLE
`MainTable` AS
SELECT * EXCEPT(RN)
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY updatedAt DESC -- the first row among duplicates will be kept, other rows will be removed
) RN
FROM
`MainTable`)
WHERE
RN = 1