Возвратите минимальную начальную дату, максимальную конечную дату и последнюю категорию для группы последовательных записей на основе даты - PullRequest
0 голосов
/ 04 июля 2019

У меня есть таблица, которая содержит идентификатор человека, идентификатор_категории, дату начала, дату окончания и категорию.Если начальная дата совпадает с предыдущей конечной датой, то это продолжение и просто означает изменение категории.В течение непрерывного периода дат может быть много изменений Категории.

Я хочу вернуть Первую дату начала и Последнюю дату окончания и Тип категории для каждого человека.

Я думал об идентификации всех тех, ктоиметь непрерывный период даты для человека и возвращать максимальные и минимальные значения и т. д. Но это не учитывает, когда у человека есть несколько непрерывных периодов дат, то есть один период заканчивается, и происходит перерыв, а затем существует другой непрерывный период с изменениями категории.

Пример вывода:

+---------+------------+------------+---------------+
|   ID    |  start_dt  |   end_dt   | category_type |
+---------+------------+------------+---------------+
| 8105755 | 26/01/2016 | 21/04/2016 | D             |
| 8105859 | 21/04/2016 | 22/04/2016 | A             |
| 8105861 | 22/04/2016 | 26/04/2016 | D             |
| 8105870 | 26/04/2016 | 19/10/2016 | A             |
+---------+------------+------------+---------------+

Так что в этом случае end_dt совпадает с предыдущим start_dt для каждой строки, это непрерывный период, поэтому я хочу вернуть одну строку сПервая дата начала, последняя дата окончания и тип последней категории, как показано ниже:

+---------+------------+------------+---------------+
|   ID    |  start_dt  |   end_dt   | category_type |
+---------+------------+------------+---------------+
| 8105870 | 26/01/2016 | 19/10/2016 | A             |
+---------+------------+------------+---------------+

1 Ответ

0 голосов
/ 04 июля 2019

Это тип проблемы пробелов и островов, которую вы можете решить, используя совокупную сумму для определения групп. Сумма основана на начале группы. Итак:

select distinct
       first_value(t.id) over (partition by grp order by t.start_dt desc) as id,
       min(t.start_dt) over (partition by grp) as start_dt,
       max(t.start_dt) over (partition by grp) as end_dt,
       first_value(t.category) over (partition by grp order by t.start_dt desc) as id
from (select t.*,
             sum(case when t.id is null then 1 else 0 end) over (order by t.start_dt) as grp
      from t left join
           t tprev
           on tprev.end_dt = t.start_dt
     ) t;

Примечание. При этом используется select distinct просто потому, что SQL Server не предлагает функции "first ()" / "last ()" для агрегирования.

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