2016-09-16 2 views
1

У меня есть набор данных, который выглядит примерно так:Сворачивание диапазоны дат в SQL (Netezza)

Visit ID Admission Date  Discharge Date  Unit 
20   01/01/2015 12:45  01/01/2015 13:57  ER 
20   01/03/2015 13:57  01/04/2015 11:57  ER 
20   01/04/2015 11:57  01/04/2015 19:32  Trauma 
20   01/04/2015 19:32  01/04/2015 21:22  ER 

Моя цель, чтобы получить допуск/разряда даты для каждого блока. Проблема в том, что иногда пациенты меняют кровати внутри одного и того же подразделения, и это действие обозначается как передача, хотя пациент все еще находится в одной и той же единице. Поэтому я хотел бы, чтобы свернуть те диапазоны дат, так что вместо этого выводится выглядит следующим образом:

Visit ID Admission Date  Discharge Date  Unit 
20   01/01/2015 12:45  01/01/2015 11:57  ER 
20   01/04/2015 11:57  01/04/2015 19:32  Trauma 
20   01/04/2015 19:32  01/04/2015 21:22  ER 

Я не знаю, как этого добиться ... Я думал о том, что раздел следует использовать, но каждый ранжирования раздела I (rank/dense_rank) присваивает первые два значения ER того же ранга, что и последнее значение ER, что было бы неверным.

В принципе, у меня вопрос такой же, это вопрос без ответа: Collapsing date records only if the value doesn't change - Oracle SQL

Я использую Netezza.

ответ

1

Вы можете использовать left join, чтобы узнать, подключено ли что-то к предыдущей записи. Если соединение отсутствует, значит, у вас есть начало «непрерывного периода». Затем кумулятивная сумма присваивает группу, которая может быть использована для агрегирования.

Вот как работает этот запрос:

select visitid, unit, 
     min(admissiondate) as admissiondate, 
     max(dischargedate) as dischargedate 
from (select t.*, 
      sum(case when tprev.visitid is null then 1 else 0 end) over 
       (partition by t.visitid, t.unit order by t.admissiondate 
       ) as grp 
     from t left join 
      t tprev 
      on t.visitid = tprev.visitid and t.unit = tprev.unit and 
       t.admissiondate = tprev.dischargedate 
    ) t 
group by grp, visitid, unit; 

Примечание: Это предполагает, что новая дата допуска точно такая же, как и предыдущие даты выписки. Конечно, вы можете ввести логику неравновесия, если вы хотите проверить, что вход произошел внутри, скажем, 10 секунд или 5 минут разгрузки.

+0

Два вопроса: 1) Являются ли поля в разделе, исходящие от t или tprev? 2) Я не совсем уверен, что делает сумма, я могу видеть результат, но я, по общему признанию, смущен – user3642531

+0

Поля от 't'; 'tprev' используется только для получения информации для флага. 'Sum()' является суммарной суммой, которая используется для назначения группы соседним строкам. Значение должно быть постоянным для того, что вы хотите назвать группой. –

+0

Я понял. И это работает. Благодаря! – user3642531