Получите дату начала и дату окончания из таблицы с единой группировкой дат по идентификатору и типу статуса - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь создать запрос, который для идентификатора получает дату начала и дату окончания на основе идентификатора и статуса.

У меня есть только три столбца для работы, отсутствуют недостающие даты . Статусы могут go перемещаться вперед и назад, например, от зеленого к желтому и обратно к зеленому. Также существует только один статус в день для каждого идентификатора.

Базовая таблица выглядит так

tblOne

ID  |StartDate      |Status |
100 |1/01/2020      |green  |
100 |2/01/2020      |yellow |
100 |3/01/2020      |yellow |
200 |3/01/2020      |green  |
100 |4/01/2020      |Orange |
200 |4/01/2020      |Orange |
100 |5/01/2020      |Orange |
200 |5/01/2020      |Red    |
100 |6/01/2020      |Orange |
100 |7/01/2020      |yellow |
100 |8/01/2020      |Orange |
100 |9/01/2020      |Orange |
100 |10/01/2020     |Orange |
100 |11/01/2020     |Orange |
100 |12/01/2020     |Red    |

Таблица, которую я хочу создать, будет выглядеть так

tblTwo

ID  |StartDate  |EndDate    |Status |
100 |1/01/2020  |1/01/2020  |Green  |
100 |2/01/2020  |3/01/2020  |yellow |
100 |4/01/2020  |6/01/2020  |Orange |
100 |7/01/2020  |7/01/2020  |yellow |
100 |8/01/2020  |11/01/2020 |Orange |
100 |12/01/2020 |12/01/2020 |Red    |
200 |3/01/2020  |3/01/2020  |green  |
200 |4/01/2020  |4/01/2020  |Orange |
200 |5/01/2020  |5/01/2020  |Red    |

Код для создания tblOne

CREATE TABLE tbleOne(ID int, StartDate Date, Status VARCHAR(20))
INSERT INTO tblOne VALUES
(100,'2020-01-01','green'),
(100,'2020-01-02','yellow'),
(100,'2020-01-03','yellow'),
(200,'2020-01-03','green'),
(100,'2020-01-04','Orange'),
(200,'2020-01-05','Orange'),
(100,'2020-01-05','Orange'),
(200,'2020-01-06','Red'),
(100,'2020-01-06','Orange'),
(100,'2020-01-07','yellow'),
(100,'2020-01-08','Orange'),
(100,'2020-01-09','Orange'),
(100,'2020-01-10','Orange'),
(100,'2020-01-11','Orange'),
(100,'2020-01-12','Red')

1 Ответ

2 голосов
/ 10 июля 2020

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

select id, status, min(startdate), max(startdate)
from (select t.*, row_number() over (partition by id, status order by startdate) as seqnum
      from tblone t
     ) t
group by id, status, dateadd(day, - seqnum, startdate)
order by id, min(startdate);

Здесь - скрипт db <>.

...