जैसा कि टिप्पणियों में बताया गया है, आप LAG
. का उपयोग कर सकते हैं इसके लिए समारोह। मूल विचार प्रत्येक पंक्ति के लिए 0/1 मान निर्दिष्ट करना है:यदि यह पिछली पंक्ति के 15 दिनों के भीतर है तो 0 अन्य 1. फिर SUM() OVER ()
का उपयोग करें। 1s और 0s को संख्याओं में बदलने के लिए जिनका उपयोग समूहीकरण के लिए किया जा सकता है।
ध्यान दें कि यह बहुत लंबी दिनांक सीमाओं को एक साथ समूहित कर सकता है उदा. 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