Сравнение дат в BigQuery

Я пытаюсь отфильтровать определенные даты в моем запросе. Строка кода, которую я использую в своем запросе, выглядит следующим образом:

(date(date_add(date_time,-1,'year')) < date(date_add(current_date(),-1,'year')) ) OR year(date_time) = 2017)

Идея состоит в том, чтобы получить все данные с начала года в 2017 году, а также данные за 2016 год, которые соответствуют тем же дням. Поэтому, если бы я запустил правильную версию того, что мне нужно, он вернул бы все данные с начала года, а также все данные за 2016 год до 16 ноября 2016 года.

Однако всякий раз, когда я запускаю запрос с этим в предложении WHERE, мой запрос по-прежнему возвращает даты, которые не вписываются в мои описанные параметры. Я могу упустить что-то совершенно очевидное, но это сводит меня с ума. Есть ли особый способ отфильтровать даты, которые я пропускаю?

Изменить: вот некоторые из моих данных

[date]       [today]    [uniques]    
2016-01-01  2017-11-16  363878   
2016-01-02  2017-11-16  383813   
2016-01-03  2017-11-16  392579   
2016-01-04  2017-11-16  709367   
..
..   
2016-11-15  2017-11-16  841850   
2016-11-16  2017-11-16  847831   
2016-11-17  2017-11-16  797610   
2016-11-18  2017-11-16  187158   
2016-11-19  2017-11-16  521100   
..   
2017-11-12  2017-11-16  297604   
2017-11-13  2017-11-16  527858   
2017-11-14  2017-11-16  474051   
2017-11-15  2017-11-16  569686   

Я добавил строку для себя, чтобы убедиться, что форматирование даты не изменилось. С этими данными не должно быть возвращено 3 нижних строки в средней секции, но они есть. Все остальное должно соответствовать параметрам, которые я установил и получить обратно.

Цени любую помощь. Спасибо!

1 ответ

Решение

Ниже для BigQuery Standard SQL:

#standardSQL
SELECT date_time, uniques 
FROM `project.dataset.yourTable`
WHERE (PARSE_DATE('%Y-%m-%d', date_time) < DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR)) 
OR EXTRACT(YEAR FROM PARSE_DATE('%Y-%m-%d', date_time)) = 2017  

Вы можете проверить / поиграть с ним, используя фиктивные данные из вашего вопроса, как показано ниже

#standardSQL
WITH `project.dataset.yourTable` AS (
  SELECT '2016-01-01' date_time, 363878 uniques UNION ALL
  SELECT '2016-01-02', 383813 UNION ALL
  SELECT '2016-01-03', 392579 UNION ALL
  SELECT '2016-01-04', 709367 UNION ALL

  SELECT '2016-11-15', 841850 UNION ALL
  SELECT '2016-11-16', 847831 UNION ALL
  SELECT '2016-11-17', 797610 UNION ALL
  SELECT '2016-11-18', 187158 UNION ALL
  SELECT '2016-11-19', 521100 UNION ALL

  SELECT '2017-11-12', 297604 UNION ALL
  SELECT '2017-11-13', 527858 UNION ALL
  SELECT '2017-11-14', 474051 UNION ALL
  SELECT '2017-11-15', 569686 
)
SELECT date_time, uniques 
FROM `project.dataset.yourTable`
WHERE (PARSE_DATE('%Y-%m-%d', date_time) < DATE_SUB(CURRENT_DATE(), INTERVAL 1 YEAR)) 
OR EXTRACT(YEAR FROM PARSE_DATE('%Y-%m-%d', date_time)) = 2017  

Настоятельно рекомендуется использовать BigQuery Standard SQL - поэтому, если вы все еще используете устаревший SQL - рассмотрите возможность перехода на стандартный SQL

Между тем, если у вас есть код в устаревшем SQL (который похож на меня) - вы можете использовать ниже

#legacySQL
SELECT date_time, uniques 
FROM [project:dataset.yourTable]
WHERE (DATE(date_time) < DATE(DATE_ADD(CURRENT_DATE(), -1, 'year'))) 
OR YEAR(date_time) = 2017  

Вы можете проверить / поиграть с фиктивными данными, как показано ниже

#legacySQL
SELECT date_time, uniques 
FROM --[project:dataset.yourTable]
  (SELECT '2016-01-01' date_time, 363878 uniques),
  (SELECT '2016-01-02' date_time, 383813 uniques),
  (SELECT '2016-01-03' date_time, 392579 uniques),
  (SELECT '2016-01-04' date_time, 709367 uniques),

  (SELECT '2016-11-15' date_time, 841850 uniques),
  (SELECT '2016-11-16' date_time, 847831 uniques),
  (SELECT '2016-11-17' date_time, 797610 uniques),
  (SELECT '2016-11-18' date_time, 187158 uniques),
  (SELECT '2016-11-19' date_time, 521100 uniques),

  (SELECT '2017-11-12' date_time, 297604 uniques),
  (SELECT '2017-11-13' date_time, 527858 uniques),
  (SELECT '2017-11-14' date_time, 474051 uniques),
  (SELECT '2017-11-15' date_time, 569686 uniques)
WHERE (DATE(date_time) < DATE(DATE_ADD(CURRENT_DATE(), -1, 'year'))) 
OR YEAR(date_time) = 2017
Другие вопросы по тегам