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