Этот запрос не выполняется один раз в месяц, как его можно исправить?

Этот запрос не выполняется один раз в месяц, потому что часть BETWEEN становится недействительной. Где value BETWEEN min AND max, 1 марта мой запрос снова завершится ошибкой, потому что он вычислит partition_2 BETWEEN 28 AND 1. Как сделать этот запрос более надежным, но при этом использовать только необходимые разделы?

WITH recent_tasks AS
(SELECT task_id, state, timestamp, partition_0, partition_1, partition_2,
  row_number() OVER (PARTITION BY task_id
               ORDER BY timestamp DESC) AS rn
FROM firehose
WHERE
 "partition_0" BETWEEN to_char(current_date - interval '1' day, 'yyyy') AND to_char(current_date, 'yyyy')
 and "partition_1" BETWEEN to_char(current_date - interval '1' day, 'mm') AND to_char(current_date, 'mm')
 and "partition_2" BETWEEN to_char(current_date - interval '1' day, 'dd') AND to_char(current_date, 'dd')
ORDER BY rn)
SELECT * FROM recent_tasks
WHERE rn=1

Пара заметок:

  • Разделы представляют собой символьные значения, а не целые числа
  • partition_2 - это раздел месяца
  • Цель запроса - найти самое последнее состояние для каждого task_id.
  • Использование AWS Athena
  • Данные хранятся в формате S3 / yyyy / mm / dd, и каждый день - новый раздел

В идеале мой запрос правильно обрабатывал бы ежемесячные переходы:

BETWEEN FEB 10 AND FEB 11 (works with above)
BETWEEN FEB 28 AND MAR 1  (fails with above)
BETWEEN MAR 1 AND MAR 2   (works with above)

person Blaine    schedule 15.02.2018    source источник
comment
WITH recent_tasks AS (SELECT task_id, state, timestamp, partition_0, partition_1, partition_2, row_number() OVER (PARTITION BY task_id поддерживается только MySQL 8.0 .. А MySQL 8.0 еще не готов к производству .. Вы уверены, что используете MySQL?   -  person Raymond Nijland    schedule 15.02.2018


Ответы (1)


Если вы хотите получить ноль вместо 28:

cast(to_char(current_date, 'dd') as signed)-1

Итак, 03/01 это вернет 1 - to_char (current_date, 'dd'), затем вычитание даст вам ноль:

and "partition_2" BETWEEN to_char(cast(to_char(current_date, 'dd') as signed)-1) AND to_char(current_date, 'dd')
person Ctznkane525    schedule 15.02.2018