2017-01-08 4 views
0

Мне нужно отслеживать амбулаторное отделение, как долго пациент участвовал в определенном амбулаторном цикле лечения, который теоретически должен быть повседневным. Как правило, я мог бы просто сделать min и max на дату назначения. Однако, если пациент пропустил неделю лечения, мне нужно снова начать отсчет дня. У меня возникают проблемы с тем, чтобы учесть этот промежуток времени.Расчет разницы между двумя датами, где существуют пробелы

Например: Пациент А посещал лечение каждый день с 1/1-1/12, затем она сделала перерыв и не вернулась до 1/20 и посетила процедуры на 1/20, 1/23, 1/26 , и 1/29. Поэтому у меня должно быть два дня: один на 12 дней и один на 10 дней.

+6

Было бы полезно иметь образцы данных и желаемые результаты. –

+2

Google для разрывов и островов. –

+1

Укажите, какую версию sql-сервера вы используете при задании вопросов. – SqlZim

ответ

1

Если у вас есть столбец с идентификатором и датой пациента, вы можете сгруппировать даты в «острова» смежности. Если правило одна неделя разницы, то вы можете использовать lag() и кумулятивные суммы:

select t.*, 
     sum(startflag) over (partition by patientid order by date) as episode 
    from (select t.*, 
       (case when lag(date) over (partition by patientid order by date) < dateadd(day, -7, date) 
        then 1 else 0 
       end) as startflag 
     from t 
     ) t 

Если вы хотите отсчет дат для каждого эпизода лечения:

select patientid, min(date), max(date), count(*) as numtreatments 
from (select t.*, 
      sum(startflag) over (partition by patientid order by date) as episode 
     from (select t.*, 
        (case when lag(date) over (partition by patientid order by date) < dateadd(day, -7, date) 
         then 1 else 0 
        end) as startflag 
      from t 
      ) t 
    ) t 
group by patientid, episode;