【问题标题】:Check any missing days record in Bigquery PartitionTable检查 Bigquery 分区表中的任何缺失天数记录
【发布时间】: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 函数,但不知道是怎么回事

【问题讨论】:

    标签: sql google-bigquery


    【解决方案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 
      

      【讨论】:

      • 哦,哇,是的,这样看起来更清晰!非常感谢您的回答。
      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      相关资源
      最近更新 更多