2013-09-06 3 views
1

J'essaie de compter les réadmissions des patients dans mon ensemble de données, mais je dois le faire en utilisant SQL. J'ai des problèmes et espère que quelqu'un pourrait me diriger dans la bonne direction. Mes données apparaît comme siComptage des réadmissions dans SQL

> ID     FirstDateofService   LastDateofService   PerformingProvider   etc. (plus de lignes non pertinentes)
        2012-09-18           2012-09 -21           St. Luke
        2012-09-29           2012-10-04          
Saint-Luc         2012-09-19           2012- 09-20           Seton
        19/09/2012           18/10/2012           Seton
        2012-09-21           2012-10- 09           Seton
        10/10/2012           17/10/2012           Seton
        2013-06-20           2013-06- 24           Denton régional
        2013-07-06           2013-07-06           Denton régional

Et les données se poursuit et.J'essaie d'écrire une requête pour compter le nombre de réadmissions (je voudrais le faire par ID) où une réadmission est constituée par l'admission après 30 jours ou moins d'être libéré du même hôpital. J'ai essayé de nombreuses façons, mais je ne peux pas arriver à des résultats précis. Toute suggestion serait appréciée. Je vous remercie.

+0

Peut-on visiter plusieurs fournisseurs? Par exemple, d'abord l'hôpital A puis l'hôpital B puis A à nouveau. Et le troisième est-il considéré comme une réadmission dès la première admission? Ou est-ce considéré comme 2 réadmissions? – Wietze314

+0

Quelle base de données? – igr

Répondre

1

Cela suppose que les personnes ne peuvent pas être réadmises le jour même de leur départ. Il suppose également que Id est une sorte d'identifiant du patient.

Select 
    Id, 
    Count(*) as Readmissions 
From 
    table a2 -- a2 happens after a1 
Where 
    Exists (
     Select 'x' 
    From 
     table a1 
    Where 
     a1.Id = a2.Id And 
     a1.PerformingProvider = a2.PerformingProvider And 
     a1.LastDateOfService < a2.FirstDateOfService And 
     dateadd(day, 30, a1.LastDateOfService) >= a2.FirstDateOfService 
    ) 
Group By 
    Id 
+0

Si vous remplacez: a1.LastDateOfService a2.FirstDateOfService, vous éviterez les doublons et autoriserez les utilisateurs à être réadmis le même jour. Je suis sûr que cela arrive :) – kmorris

+0

C'est mieux, mais échouerait encore si quelqu'un a été admis et libéré deux fois le même jour. Vraiment, vous avez besoin d'une clé primaire ou un db généré rowid – Laurence

+0

True. Je travaillais sur les données qu'on nous avait données ... et vous avez besoin d'une clé unique par admission. – kmorris

0
/* 

drop table #t 
create table #t (id int, FirstDateOfService datetime, LastDateOfService datetime,   PerformingProvider varchar(30)); 
go 
insert into #t (id, FirstDateOfService, LastDateOfService, PerformingProvider) 
values 
(2202 , '2012-09-18' , '2012-09-21' ,   'St. Luke''s') 
,(2202 , '2012-09-29' , '2012-10-04',   'St. Luke''s') 
,(4280 , '2012-09-19' , '2012-09-20',   'Seton') 
,(4280 , '2012-09-19' , '2012-10-18',   'Seton') 
,(4280 , '2012-09-21' , '2012-10-09',   'Seton') 
,(4280 , '2012-10-10' , '2012-10-17',   'Seton') 
,(8980 , '2013-06-20' , '2013-06-24',   'Denton Regional') 
,(8980 , '2013-07-06' , '2013-07-06' ,   'Denton Regional') 
*/ 
;with cte (rid, id, FirstDateOfService, LastDateOfService, PerformingProvider) 
as (
    select rid=row_number() over (PARTITION BY id order by FirstDateOfService),* 
    from #t 
) 
select t1.id, t1.PerformingProvider, Readmission=count(*) 
from cte t1 
inner join cte t2 
on t1.id = t2.id 
and t1.rid = t2.rid-1 
and t2.FirstDateOfService < dateadd(day, 30, t1.LastDateOfService) 
and t1.PerformingProvider = t2.PerformingProvider 
group by t1.id, t1.PerformingProvider 
order by t1.id; 

Cependant, je pense que vos données doivent être nettoyés. Comment se fait-il que id = 4280 ait deux firstdayofservice (2012-09-19) et pourtant un lastdayofservice différent?