Như đã đề cập trong phần nhận xét, bạn có thể sử dụng LAG
chức năng này. Ý tưởng cơ bản là chỉ định giá trị 0/1 cho mỗi hàng:nếu nó nằm trong vòng 15 ngày kể từ hàng trước đó thì 0 khác 1. Sau đó sử dụng SUM() OVER ()
để chuyển đổi số 1 và số 0 thành số có thể được sử dụng để nhóm.
Lưu ý rằng điều này có thể nhóm các phạm vi ngày dài hơn với nhau, ví dụ:01-01
, 01-11
, 01-21
, 02-01
và 02-11
sẽ được nhóm lại với nhau mặc dù ngày đầu tiên và ngày cuối cùng cách nhau hơn 15 ngày.
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