Получить все недостающие даты в последовательности дат

#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:

  1. создайте новую таблицу и вставьте 365 строк с номерами 1-365 (альтернативно используйте таблицу, в которой уже более 365 строк, и используйте rownum или аналогичную конструкцию для получения уникальных целых чисел)

  2. Преобразуйте ваши даты в целые числа (в Oracle используйте что-то вроде TO_CHAR( mydate, 'ddd' ) )

  3. объедините эти два списка вместе в своем запросе, чтобы найти соответствующий набор (перекрытие, отсутствие и т. Д.)

  4. преобразовать обратно в даты

Комментарии:

1. Я использую Amazon redshift

2. @Teja Я не понимаю, что Amazon Redshift поддерживает cte.

3. Amazon Redshift не поддерживает рекурсивные cte. Проверьте эту ссылку. docs.aws.amazon.com/redshift/latest/dg /…

4. Этот ответ не помогает мне, Рэнди:(

5. хорошо — извините — это шаблон, который вы используете, чтобы избежать CTE — вам нужна другая таблица со всеми датами в ней для сравнения — целые числа — лучший вариант.