SQL: Lücken und Inseln, Gruppierte Daten

Ich versuche, Daten innerhalb von 3 Tagen zu gruppieren und Punkte basierend auf den Rückübernahmen innerhalb von 30 Tagen zuzuweisen. Eine MRN würde 3 Punkte pro Rückübernahme erhalten. Jede Hilfe zum Ändern meiner Abfrage unten wäre großartig.

Beispiel

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') 

Gewünschte Ausgabe: Ich brauche wirklich nur die tatsächlichen Besuche, OrganizationMrn und Punkte. (Wenn Daten gruppiert sind (tatsächliche Besuche), sollte das erste Datum innerhalb von 30 Tagen für die Rückübernahme verwendet werden.)

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)

Die folgende Abfrage verwendet Lücken und Inseln, um Tage innerhalb von 3 Tagen zu gruppieren. Wenn die Daten jedoch aufeinander folgen, werden die Start- / Enddaten gruppiert. (Beispiel: Die folgende Abfrage gruppiert [1/2, 1/5, 1/7 /, 1/8, 1/9] in eine Zeile Daten sollten in zwei Zeilen aufgeteilt werden [1/2, 1/5] und [1/7 /, 1/8, 1/9].

Da die gruppierten Daten einzelne Zeilen haben, muss ich jeder Rückübernahme innerhalb von 30 Tagen 3 Punkte zuweisen. (Tatsächlicher Besuch pro OrganizationMrn innerhalb von 30 Tagen). Der gewünschte Ausgabeabschnitt oben beschreibt, wie die Daten in meinem Beispiel gruppiert werden sollen.

;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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage