Этот запрос не выполняется один раз в месяц, потому что часть 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)
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