Как сгруппировать набор записей в таблице журнала на основе изменений статуса - PullRequest
0 голосов
/ 09 мая 2020

У меня есть большая таблица действий, в которой указаны все действия, предпринятые по делу. некоторые из этих действий изменяют статус дела. Некоторые действия не изменяют статус дела и по сути должны быть статусом предыдущей ненулевой записи. образец:

caseID | datetime | action | status
1        1/1/2020      a     OPEN
1        1/2/2020      B     NULL
1        1/3/2020      G     CLOSED
1        1/5/2020      T     REOPEN
1        1/6/2020      H     NULL
1        1/7/2020      H     NULL
1        1/9/2020      G     CLOSED
1        1/10/2020     J     CLOSED
1        1/15/2020     P     CLOSED

результат, которого я пытаюсь достичь, - это сгруппировать и прикрепить номер «сеанса» к набору дат, которые содержат диапазон дат от открытия ИЛИ повторного открытия ДО закрытия. Идея здесь в том, что если dateto равно NULL, то это текущий статус:

CaseID | status | datefrom | dateto | session
1        OPEN     1/1/2020   1/3/2020   1
1        CLOSED   1/3/2020   1/5/2020   1
1        REOPEN   1/5/2020   1/9/2020   2
1        CLOSED   1/9/2020   NULL       2

Я использую SQL 2014 Enterprise Edition и много дней ломал себе голову над этим ... помощь будет очень признательна. Я нашел несколько подсказок по stackoverflow, но ничего, что полностью удовлетворяет необходимый результат.

EDIT: вот лучший пример данных:

caseID | datetime | action | status
1        1/1/2020      a     OPEN
1        1/2/2020      B     REOPEN
1        1/3/2020      G     CLOSED
1        1/5/2020      T     REOPEN
1        1/6/2020      H     NULL
1        1/7/2020      H     NULL
1        1/9/2020      G     CLOSED
1        1/10/2020     J     CLOSED
1        1/15/2020     P     CLOSED
1        1/16/2020     P     WORKABLE
1        1/17/2020     P     NULL
1        1/18/2020     P     WORKABLE
1        1/19/2020     P     WORKABLE
1        1/20/2020     P     CLOSED
1        2/1/2020      o     NULL

ОЖИДАЕМЫЙ ВЫХОД:

CaseID | status | datefrom | dateto | session
1        OPEN     1/1/2020   1/3/2020   1
1        CLOSED   1/3/2020   1/5/2020   1
1        REOPEN   1/5/2020   1/9/2020   2
1        CLOSED   1/9/2020   1/16/2020  2
1        WORKABLE 1/16/2020  1/20/2020  3
1        CLOSED   1/20/2020  NULL       3 

1 Ответ

1 голос
/ 09 мая 2020

Это отвечает на исходную версию вопроса.

Я не уверен, отвечает ли это всем вашим требованиям, но он дает указанные вами результаты:

  • Вычтите NULL значения.
  • Назначить сеанс на основе количества «открытых» или «повторных открытий» до строки
  • Совокупный:

Итак:

select caseid, session, status, min(datetime),
       lead(min(datetime)) over (partition by caseid order by min(datetime))
from (select t.*,
             sum(case when status in ('OPEN', 'REOPEN') then 1 else 0 end) over (partition by caseid order by datetime) as session
      from t
      where status is not null
     ) t
group by caseid, session, status
order by caseid, min(datetime);

Здесь - скрипт db <>, иллюстрирующий, что эта интерпретация работает для предоставленных вами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...