检查 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 分区表中的任何缺失天数记录的主要内容,如果未能解决你的问题,请参考以下文章