Сгруппируйте строки с интервалом менее 15 дней и назначьте минимальную / максимальную дату - PullRequest
0 голосов
/ 28 ноября 2018

Если protocol_opening_date различных протоколов находится в пределах 15 дней друг от друга, мне нужно показать их как один протокол в другом столбце с именем ожидаемой даты начала.

Я не знаю, как скопировать мою таблицу здеськак это выглядит, но я постараюсь объяснить как можно больше.

Итак, скажем, если один протокол имеет дату начала 24.01.2018 и дату конца 30.01.2018, а другой протокол имеет дату начала 25.01.2018 и end_date от 10.02.2018

Мне нужно отобразить их как разные протоколы с start_date 24.01 и end_date 10.02, потому что они составляют 15 дней друг от друга.

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

enter image description here

Редактировать: Я добавил часть таблицы, те же цвета - протоколы, которые были объединены в один протокол.Beklenen_baslangıc == Ожидаемое_старт_дата

1 Ответ

0 голосов
/ 28 ноября 2018

Как уже упоминалось в комментариях, вы можете использовать для этого функцию LAG.Основная идея состоит в том, чтобы назначить значение 0/1 для каждой строки: если оно находится в пределах 15 дней от предыдущей строки, то 0 или 1. Затем используйте SUM() OVER (), чтобы преобразовать 1 и 0 в числа, которые можно использовать для группировки.

Обратите внимание, что это может сгруппировать гораздо более длинные диапазоны дат, например, 01-01, 01-11, 01-21, 02-01 и 02-11 будут сгруппированы вместе, хотя первая и последняя даты более 15 днейотдельно.

DECLARE @T TABLE (HASTA_ID INT, PROTOKOL_ID INT, STARTDATE DATE, ENDDATE DATE);
INSERT INTO @T VALUES
(273065, 11, '2018-01-24', '2018-01-30'),
(273065, 12, '2018-01-25', '2018-02-10'),
(273065, 13, '2018-01-30', '2018-01-30'),
(273065, 14, '2018-02-23', '2018-02-28'),
(273065, 15, '2018-03-21', '2018-03-29'),
(273065, 16, '2018-05-03', '2018-05-04'),
(273065, 17, '2018-05-03', '2018-05-08'),
(273065, 18, '2018-05-14', '2018-05-22'),
(273065, 19, '2018-05-22', '2018-05-23'),
(273065, 20, '2018-09-20', '2018-09-30');

WITH CTE1 AS (
    SELECT *, CASE WHEN LAG(STARTDATE) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) >= DATEADD(DAY, -14, STARTDATE) THEN 0 ELSE 1 END AS CHG
    FROM @T
), CTE2 AS (
    SELECT *, SUM(CHG) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) AS GRP
    FROM CTE1
)
SELECT *,
    MIN(STARTDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_STARTDATE,
    MAX(ENDDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_ENDDATE
FROM CTE2
ORDER BY HASTA_ID, STARTDATE

Демонстрация на DB Fiddle

...