SQL readmits dans les partitions de 30 jours

J'essaie de regrouper les réadmissions de patients dans des windows séparées de 30 jours (SQL Server 2008). Après plusieurs tentatives de CTE récursives, je ne fais que tourner en rond. Toute aide est grandement appréciée.

Problème:

Si un patient est admis dans les 30 jours suivant la première sortie, countz toutes les admissions dans la première période (dans l'exemple ci-dessous, la deuxième date d'admission du 7/7/2011 est dans la window du 20/07/2011).

La première admettre immédiatement après la période de 30 jours ci-dessus devrait être traitée comme une nouvelle window de 30 jours et toute admission dans les 30 jours suivant sa sortie fait partie du groupe 2, etc.

Ainsi, l'logging 3 est le début d'une nouvelle window de 30 jours, même si cet aveu est dans les 30 jours suivant la sortie du précédent (admettre le 8/5/2011 est avant le 26/08/2011, mais 8/5 / 2011 est supérieur au terminal du 20/07/2011 qui a démarré la première window de 30 jours).

Record 4 a été admis avant le 31/08/2011, il devrait donc être inclus dans le groupe 2.

Record 5 est le seul à être admis car il a été admis plus de 30 jours après la date du 31/08/2011 qui a mis fin au groupe 2.

La sortie souhaitée pour l'exemple de jeu d'loggings est la sum des frais pour chaque sharepoint départ de 30 jours.

Résultat désiré:

 MRN Admettre TotalCharge
 555 14/06/2011 25 $
 555 30/07/2011 39 $
 555 11/3/2011 10 $

Exemple de jeu d'loggings:


 Acct MRN Admit Disc Disch + 30 Charge
 590 555 6/14/2011 6/20/2011 7/20/2011 15
 938 555 7/7/2011 7/27/2011 8/26/2011 10
 1011 555 7/30/2011 8/1/2011 8/31/2011 9
 1089 555 8/5/2011 9/14/2011 10/14/2011 30
 3011 555 11/3/2011 11/23/2011 12/23/2011 10

On dirait que j'ai peut-être été un peu ambitieux en insistant sur le fait que cela pourrait être fait avec une seule requête basée sur un set. Cela se rapproche, mais restitue les résultats à une table #temp afin de prendre en charge les mises à jour quasi-parallèles (un "thread" par valeur MRN, plutôt qu'un slider qui parcourt un MRN à la fois).

DECLARE @t TABLE(Acct INT, MRN INT, Admit DATE, Disc DATE, Charge INT); INSERT @t VALUES (590 , 555, '20110614','20110620',15), (938 , 555, '20110707','20110727',10), (1011, 555, '20110730','20110801', 9), (1089, 555, '20110805','20110914',30), (3011, 555, '20111103','20111123',10); SELECT MRN, [group] = CONVERT(INT, NULL), Admit, Disc, Charge, rn = ROW_NUMBER() OVER (PARTITION BY MRN ORDER BY Admit), da = DATEADD(DAY, 30, Disc) INTO #x FROM @t; -- add a WHERE clause if examining a set in a bigger table DECLARE @rn INT = 0; WHILE @rn IS NOT NULL BEGIN SELECT @rn = MIN(rn) FROM #x WHERE [group] IS NULL; UPDATE agg SET [group] = @rn FROM #x AS agg INNER JOIN #x AS src ON agg.MRN = src.MRN AND agg.Admit <= src.da AND agg.[group] IS NULL AND src.rn = @rn; END GO SELECT MRN, Admit = MIN(Admit), TotalCharge = SUM(Charge) FROM #x GROUP BY MRN, [group]; GO DROP TABLE #x; 

Résultats:

 MRN Admit TotalCharge --- ---------- ----------- 555 2011-06-14 25 555 2011-07-30 39 555 2011-11-03 10 

Effectuer une auto-inscription de la table de dates à elle-même, afin d'identifier toutes les admissions NON précédées d'une autre admission dans les 30 jours; appelle cette relation T1 et en fait une sous-requête de la requête principale.

Rejoindre maintenant T1 aux données pour récupérer toutes les admissions secondaires des données pour chaque ligne dans T1.

Je pourrais avoir le time de regarder ça plus tard ce soir.