Проверьте все пропущенные дни в Bigquery PartitionTable - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть таблица 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, но не могу сказать, как

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Вы пошли по этому поводу неправильно:

day = DATE(KeyPartitionDate)

тогда вы сделали

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

, что в основном говорит, что dayplusone = день + (1 день)

Затем вы делаете:

WHERE DATE_DIFF(day, dayplusone , DAY) > 1

, что похоже на высказывание: dayplusone - день> (1 день), что будет означать

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 
1 голос
/ 15 апреля 2020

Ниже для BigQuery Standard 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...