2016-03-25 2 views
2

У меня есть данные, которые в этом формате:Создание упорядоченного флага с использованием критериев даты

id start_date end_date 
25 1-Jan-00 24-Jan-00 
25 26-Jan-00 5-Feb-00 
25 3-Nov-00 6-Mar-01 
25 10-Mar-01 4-Jun-02 
25 2-Jul-03 6-Aug-03 
93 2-May-14 4-May-14 
93 8-May-14 6-Aug-14 
93 9-Aug-14 1-Feb-15 
93 3-Feb-15 14-Mar-15 
93 9-Jul-15 1-Dec-15 
93 2-Mar-16 7-Mar-16 
93 2-Apr-16 1-May-16 

Я хочу, чтобы создать поле, называемое «string_num», учитывающий рядом, чтобы быть частью строки, если дата окончания предыдущей строки (упорядоченной по id и start_date) в течение 7 дней с даты начала текущей строки. Это будет выглядеть так:

id start_date end_date string_num 
25 1-Jan-00 24-Jan-00 1 
25 26-Jan-00 5-Feb-00 1 
25 3-Nov-00 6-Mar-01 2 
25 10-Mar-01 4-Jun-02 2 
25 2-Jul-03 6-Aug-03 3 
93 2-May-14 4-May-14 1 
93 8-May-14 6-Aug-14 1 
93 9-Aug-14 1-Feb-15 1 
93 3-Feb-15 14-Mar-15 1 
93 9-Jul-15 1-Dec-15 2 
93 2-Mar-16 7-Mar-16 3 
93 2-Apr-16 1-May-16 4 

Должен ли я использовать рекурсивный запрос для этого?

+0

Какая СУБД вы используете? –

+0

@a_horse_with_no_name Я использую sql-разработчик для подключения к базе данных Oracle – staplertape

+0

Хммм. , , Вы определяете логику, которая является логической («if») и вызывает что-то «string_id». Ваши желаемые результаты имеют целое число и нечто, называемое 'string_num'. Просьба уточнить вопрос. –

ответ

1

Вы можете сделать это с помощью аналитических функций. LAG() используется для получения предыдущей даты. Затем используйте SUM() для выполнения суммарной суммы с некоторой логикой:

select t.*, 
     sum(case when prev_end_date + 7 >= start_date then 0 else 1 
      end) over (partition by id order by start_date) as string_num 
from (select t.*, 
      lag(end_date) over (partition by id order by start_date) as prev_end_date 
     from t 
    ) t; 
+0

Спасибо, это именно то, что мне нужно. – staplertape

Смежные вопросы