检查 Bigquery 分区表中的任何缺失天数记录

Posted

技术标签:

【中文标题】检查 Bigquery 分区表中的任何缺失天数记录【英文标题】:Check any missing days record in Bigquery PartitionTable 【发布时间】:2020-04-15 15:05:00 【问题描述】:

我有一个带有日期分区键的 Bigquery 表。 我在该表中获取每日记录,并尝试查找类似 3 年的历史数据是否缺少任何一天。 所以我尝试使用以下查询:

SELECT KeyPartitionDate
FROM (
  SELECT KeyPartitionDate, DATE(KeyPartitionDate) as day, DATE_ADD(date(KeyPartitionDate), INTERVAL 1 DAY) AS dayplusone
  FROM `project.dataset.table`
)
WHERE DATE_DIFF(day, dayplusone , DAY) > 1
GROUP BY KeyPartitionDate
ORDER BY KeyPartitionDate 

查询有效但不返回任何结果,而我知道有一些... 我的猜测是我弄乱了 DATE_ADD 函数,但不知道是怎么回事

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL,只是为您提供缺失天数的列表

#standardSQL
SELECT day AS missing_days 
FROM (
  SELECT MIN(KeyPartitionDate) min_day, MAX(KeyPartitionDate) max_day
  FROM `project.dataset.table`
), UNNEST(GENERATE_DATE_ARRAY(min_day, max_day)) day
LEFT JOIN (
  SELECT DISTINCT KeyPartitionDate AS day
  FROM `project.dataset.table`
) t 
USING(day)
WHERE t.day IS NULL

【讨论】:

【参考方案2】:

你搞错了:

day = DATE(KeyPartitionDate)

你做到了

dayplusone  = DATE_ADD(date(KeyPartitionDate), INTERVAL 1 DAY) 

这基本上是说 dayplusone = day +(1 day)

然后你做:

WHERE DATE_DIFF(day, dayplusone , DAY) > 1

这就像说:dayplusone - day > (1 day) 这意味着

day + (1 day) - day > (1 day)

您可以清楚地看到错误的原因。

您需要做的是将当前行日期与之前的行日期进行比较。这是使用窗口函数实现的:

SELECT KeyPartitionDate FROM (
SELECT DISTINCT KeyPartitionDate,
  LAG(KeyPartitionDate)
    OVER (ORDER BY KeyPartitionDate ASC) AS PreviousKeyPartitionDate
FROM `project.dataset.table`) 
WHERE DATE_DIFF(DATE(PreviousKeyPartitionDate),DATE(KeyPartitionDate), DAY ) > 1
ORDER BY KeyPartitionDate 

【讨论】:

哦,哇,是的,这样看起来更清晰!非常感谢您的回答。

以上是关于检查 Bigquery 分区表中的任何缺失天数记录的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 记录类型缺失

检查日期范围与其他一些日期范围的缺失天数

是否有元数据表来检查 BigQuery 中的表是否已分区?

列中的 BigQuery 日期分区

选择查询以使用 BigQuery 对输出 json 中的记录进行分组

BigQuery 未在 LEFT JOIN 中返回缺失的 NULL 行