#sql #amazon-redshift #paraccel
#sql #amazon-redshift #paraccel
Вопрос:
Я пытаюсь получить все недостающие даты в последовательности дат, которые расположены в порядке возрастания. Как я могу это сделать, используя простой sql без использования каких-либо функций или udfs.
Input :-
2016-09-01
2016-09-02
2016-09-05
2016-09-10
Вывод :-
2016-09-03
2016-09-04
2016-09-06
2016-09-07
2016-09-08
2016-09-09
Что я пробовал?
select start, stop
from
(
select m.x 1 as start,
(select min(x) - 1 from X as x where x.x > m.x) as stop
from X as m
left outer join X as r
on m.x = r.x - 1
where r.x is null
) as x
where stop is not null;
Комментарии:
1. было бы полезно, если бы вы отметили используемую СУБД, а также показали свою попытку.
2. Я пытаюсь решить это, используя целые числа, а затем перейти к датам.
3. поддерживает ли ваша БД рекурсивные общие табличные выражения?
4. Да, поддерживаются CTE
5. Для меня это не похоже на пропущенные даты
Ответ №1:
-
создайте новую таблицу и вставьте 365 строк с номерами 1-365 (альтернативно используйте таблицу, в которой уже более 365 строк, и используйте rownum или аналогичную конструкцию для получения уникальных целых чисел)
-
Преобразуйте ваши даты в целые числа (в Oracle используйте что-то вроде
TO_CHAR( mydate, 'ddd' )
) -
объедините эти два списка вместе в своем запросе, чтобы найти соответствующий набор (перекрытие, отсутствие и т. Д.)
-
преобразовать обратно в даты
Комментарии:
1. Я использую Amazon redshift
2. @Teja Я не понимаю, что Amazon Redshift поддерживает cte.
3. Amazon Redshift не поддерживает рекурсивные cte. Проверьте эту ссылку. docs.aws.amazon.com/redshift/latest/dg /…
4. Этот ответ не помогает мне, Рэнди:(
5. хорошо — извините — это шаблон, который вы используете, чтобы избежать CTE — вам нужна другая таблица со всеми датами в ней для сравнения — целые числа — лучший вариант.