2016-09-21 10 views
5

मैं एक दूसरे के 3 दिनों के भीतर तिथियों को समूहबद्ध करने की कोशिश कर रहा हूं और 30 दिनों के भीतर रीडमिशन के आधार पर अंक असाइन कर रहा हूं। एक एमआरएन प्रति पाठ 3 अंक प्राप्त होगा। नीचे मेरी क्वेरी को संशोधित करने में कोई मदद महान होगी।एसक्यूएल: गैप्स और द्वीप समूह, समूहित दिनांक

उदाहरण:

CREATE TABLE #z  (
    ID INT IDENTITY(1,1), 
    OrganizationMrn INT, 
    VisitDate DATE, 
    CATEGORY VARCHAR(15)) 

INSERT #z(OrganizationMrn, VisitDate, CATEGORY) 
VALUES 
(1, '1/2/2016','Inpatient'), 
(1, '1/5/2016','Inpatient'), 
(1, '1/7/2016','Inpatient'), 
(1, '1/8/2016','Inpatient'), 
(1, '1/9/2016','Inpatient'), 
(1, '2/4/2016','Inpatient'), 
(1, '6/2/2016','Inpatient'), 
(1, '6/3/2016','Inpatient'), 
(1, '6/5/2016','Inpatient'), 
(1, '6/6/2016','Inpatient'), 
(1, '6/8/2016','Inpatient'), 
(1, '7/1/2016','Inpatient'), 
(1, '8/1/2016','Inpatient'), 
(1, '8/4/2016','Inpatient'), 
(1, '8/15/2016','Inpatient'), 
(1, '8/18/2016','Inpatient'), 
(1, '8/28/2016','Inpatient'), 
(1, '10/12/2016','Inpatient'), 
(1, '10/15/2016','Inpatient'), 
(1, '11/17/2016','Inpatient'), 
(1, '12/20/2016','Inpatient') 

वांछित आउटपुट: मैं वास्तव में केवल वास्तविक विज़िट, OrganizationMrn, और अंक की जरूरत है। (जब तारीखों को समूहीकृत किया जाता है (वास्तविक विज़िट), पहली तारीख 30 दिनों के भीतर रीडमिशन के लिए उपयोग की जानी चाहिए)।

ACTUAL Visits Grouped Dates    Re-admissions  Points 
1/2/2016  (grouped 1/2, 1/5) 
1/7/2016  (grouped 1/7, 1/8, 1/9)  Readmit from 1/2 (3 points) 
2/4/2016         Readmit from 1/7 (3 points) 
6/2/2016  (grouped 6/2, 6/3, 6/5) 
6/6/2016  (grouped 6/6, 6/8)   Readmit from 6/2 (3 points) 
7/1/2016         Readmit from 6/6 (3 points) 
8/1/2016  (grouped 8/1, 8/4) 
8/15/2016  (grouped 8/15, 8/18)  Readmit from 8/1 (3 points) 
8/28/2016         Readmit from 8/15 (3 points) 
10/12/2016  (grouped 10/12, 10/15) 
11/17/2016 
12/20/2016 
___________________________________________ 6 total readmits (18 total points) 

क्वेरी के नीचे एक दूसरे के 3 दिन के भीतर समूह दिनों के लिए अंतराल और द्वीपों का उपयोग करता है। हालांकि यदि तिथियां लगातार होती हैं, तो प्रारंभ/समाप्ति तिथियां समूहबद्ध होती हैं। (उदाहरण: समूह के नीचे क्वेरी, [1/2, 1/5, 1/7 /, 1/8, 1/9] एक पंक्ति में; तिथियों को दो पंक्तियों में विभाजित किया जाना चाहिए [1/2, 1/5] और [1/7 /, 1/8, 1/9])।

समूहबद्ध तिथियों में व्यक्तिगत पंक्तियां होने के बाद मुझे 30 दिनों के भीतर प्रत्येक रीडमिशन को 3 अंक असाइन करने की आवश्यकता होती है। (संगठन के प्रति वास्तविक यात्रा एक दूसरे के 30 दिनों के भीतर)। ऊपर वांछित आउटपुट अनुभाग वर्णन करता है कि मेरे उदाहरण की तिथियों को कैसे समूहीकृत किया जाना चाहिए।

;WITH StartingPoints AS (
    SELECT OrganizationMrn, VisitDate, ROW_NUMBER() OVER (ORDER BY VisitDate) AS Sequence FROM #z AS A 
    WHERE a.category = 'Inpatient' AND NOT EXISTS (
     SELECT * FROM #z AS B 
     WHERE B.OrganizationMrn = A.OrganizationMrn AND 
       B.VisitDate >= DATEADD(DAY, -4, A.VisitDate) AND 
       B.VisitDate < A.VisitDate AND 
       B.Category = 'Inpatient' ) ), 
EndingPoints AS (
    SELECT OrganizationMrn, VisitDate, ROW_NUMBER() OVER (ORDER BY VisitDate) AS Sequence FROM #z AS A 
    WHERE a.category = 'Inpatient' AND NOT EXISTS (
     SELECT * FROM #z AS B 
     WHERE B.OrganizationMrn = A.OrganizationMrn AND 
       B.VisitDate <= DATEADD(DAY, 4, A.VisitDate) AND 
       B.VisitDate > A.VisitDate AND 
       B.Category = 'Inpatient' ) ) 
SELECT S.OrganizationMrn, S.VisitDate AS StartDate, E.VisitDate AS EndDate, CEILING((DATEDIFF(DAY, S.VisitDate, E.VisitDate) + 1)/4.0) AS Points 
FROM StartingPoints AS S 
    JOIN EndingPoints AS E ON (E.Sequence = S.Sequence) 
ORDER BY S.OrganizationMrn DESC 
+1

1/7 के साथ 1/5 समूह क्यों नहीं है? –

+0

या 6/6 के साथ 6/5? –

+0

1/5 को 1/7 के साथ समूहीकृत नहीं किया गया है क्योंकि 1/2 1/5 के लिए वास्तविक यात्रा है (समूह में पहली तारीख वास्तविक विज़िट दिनांक है)। 1/7 1/2 के 3 दिनों के भीतर नहीं है इसलिए 1/7 एक नई यात्रा होगी। क्या इसका कोई मतलब है? – JBritton

उत्तर

2

यह उत्तर आपके द्वारा प्रदान किए गए उदाहरण के लिए काम करता है। यदि आपके पास छोटी टेबल और सीमित प्रवेश है तो यह उपयोगी हो सकता है। (यह तिथियों पर रिकर्सन का उपयोग करें)।

WITH a AS (
    SELECT 
     z1.VisitDate 
     , z1.OrganizationMrn 
     , (SELECT MIN(VisitDate) FROM #z WHERE VisitDate > DATEADD(day, 3, z1.VisitDate)) AS NextDay 
    FROM 
     #z z1 
    WHERE 
     CATEGORY = 'Inpatient' 
), a1 AS ( 
    SELECT 
     OrganizationMrn 
     , MIN(VisitDate) AS VisitDate 
     , MIN(NextDay) AS NextDay 
    FROM 
     a 
    GROUP BY 
     OrganizationMrn 
), b AS (
    SELECT 
     VisitDate 
     , OrganizationMrn 
     , NextDay 
     , 1 AS OrderRow 
    FROM 
     a1 


    UNION ALL 

    SELECT 
     a.VisitDate 
     , a.OrganizationMrn 
     , a.NextDay 
     , b.OrderRow +1 AS OrderRow 
    FROM 
     a 
     JOIN b 
     ON a.VisitDate = b.NextDay 
), c AS (
SELECT 
    VisitDate 
    , (SELECT MAX(VisitDate) FROM b WHERE b1.VisitDate > VisitDate) AS PreviousVisitDate 
FROM 
    b b1 
) 
SELECT 
    c1.VisitDate 
    , CASE 
     WHEN DATEDIFF(day,c1.PreviousVisitDate,c1.VisitDate) < 30 THEN PreviousVisitDate 
     ELSE NULL 
    END AS ReAdmissionFrom 
    , CASE 
     WHEN DATEDIFF(day,c1.PreviousVisitDate,c1.VisitDate) < 30 THEN 3 
     ELSE 0 
    END AS Points 
FROM 
    c c1 
संबंधित मुद्दे