从BigQuery表中删除最早的重复行

时间:2019-04-24 13:38:49

标签: google-bigquery

我有一个表,其中包含> 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不支持它。

2 个答案:

答案 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