BigQuery重复数据删除和分区表

时间:2017-07-21 11:05:30

标签: google-bigquery

我想在BigQuery中创建一个允许以下内容的视图:

  • 记录的重复数据删除
  • 将_PARTITIONTIME公​​开为用于过滤以允许分区修剪的列

我知道建议的重复数据删除查询是:

SELECT
  * EXCEPT(row_number)
  FROM (
SELECT *
    ,ROW_NUMBER()
          OVER (PARTITION BY fct.KeyColumn ORDER BY fct.CreatedDatetime DESC) row_number
FROM `my-project.my_dataset.fact_table` fct)
WHERE
  row_number = 1

关于如何查询分区表的建议方法是:

SELECT
  *
FROM
  `my-project.my_dataset.fact_table`
WHERE
  _PARTITIONTIME BETWEEN TIMESTAMP('2016-01-01')
  AND TIMESTAMP('2016-01-02');

如何将两者结合以提供重复数据删除的BigQuery视图,并提供一列以允许在视图的where子句中使用_PARTITIONTIME。如果使用子选择等,我读到了分区修剪的局限性,这就是我想知道这是否可行的原因。

为了给你一些上下文,这个视图位于一个正在流式传输的表的顶部,因此重复数据删除必须在运行中发生。

1 个答案:

答案 0 :(得分:3)

您需要让视图每天返回最新一行,以便对分区时间进行过滤。它会是这样的:

#standardSQL
SELECT day, latest_row.*
FROM (
  SELECT
    _PARTITIONTIME AS day,
    ARRAY_AGG(fct ORDER BY fct.CreatedDatetime DESC LIMIT 1)[OFFSET(0)] AS latest_row
  FROM `my-project.my_dataset.fact_table` AS fct
  GROUP BY day, KeyColumn
);

在外部查询中,latest_row.*还应包含KeyColumn