Идентификация Последовательного дня Доступность с Островами - PullRequest
1 голос
/ 03 марта 2020

У меня проблема с тем, что мне нужно определить расписание на основе доступных мест и навыков в течение нескольких дней подряд.

Набор данных предоставляется в следующем формате:

[Местоположение] | [ID класса] | [Дата] | [Комната] | [Доступен]

Ожидается, что результаты будут отформатированы аналогично многоуровневой лепешке, где в нижнем слое находится наибольшее количество доступных пятен в самом длинном диапазоне дат. следующий слой будет содержать оставшиеся комнаты, которые охватывают большинство дней подряд, и так далее.

У кого-нибудь есть идеи, как вы могли бы решить эту проблему?

Я создал быстрый запрос для получения групп последовательных дней:

SELECT [LOCATION], ROOM_ID, CLASS_ID, [DATE]
        ,DATEADD(DAY, - ROW_NUMBER() OVER (PARTITION BY ROOM_ID ORDER BY [DATE]), [DATE]) AS DT_GRP
        , ROW_NUMBER() OVER (PARTITION BY ROOM_ID ORDER BY [DATE]) ROWID
FROM dbo.LECTURE_SPACE 

И получение минимальной / максимальной даты, сгруппированной по DT_GRP, идентифицирует правильные начальные / конечные дни ' слои '.
Я зациклен на том, как нужно определить следующий слой, если к этому добавятся свободные места, et c.

У кого-нибудь есть мысли? и заранее благодарим вас за вашу помощь.

Пример данных:

CREATE TABLE #LECTURE_SPACE
(
[LOCATION] NVARCHAR(10) NOT NULL,
CLASS_ID NVARCHAR(10) NOT NULL,
ROOM_ID NVARCHAR(10) NOT NULL,
[DATE] DATE NOT NULL,
AVAIL DECIMAL(19,0) NOT NULL
)

INSERT INTO #LECTURE_SPACE VALUES('BROOKS', '1020', 'Room 109', ('01/01/2020'),4);
INSERT INTO #LECTURE_SPACE VALUES('BROOKS', '1020', 'Room 109', ('01/02/2020'),4);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/03/2020'),1);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/04/2020'),5);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/05/2020'),6);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/07/2020'),6);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/08/2020'),1);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/10/2020'),6);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/11/2020'),7);
INSERT INTO #LECTURE_SPACE  VALUES('BROOKS', '1020', 'Room 109', ('01/12/2020'),6);

SELECT [LOCATION], ROOM_ID, CLASS_ID, [DATE]
        ,DATEADD(DAY, - ROW_NUMBER() OVER (PARTITION BY ROOM_ID ORDER BY [DATE]), [DATE]) AS DT_GRP
        , ROW_NUMBER() OVER (PARTITION BY ROOM_ID ORDER BY [DATE]) ROWID
FROM #LECTURE_SPACE  

С результатами, ожидаемыми как: Ожидаемые результаты

...