2013-09-06 2 views
1

데이터 세트에서 환자 재출입 수를 계산하려고하지만 SQL을 사용해야합니다. 나는 곤경에 처하고 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바란다. 내 데이터 그래서SQL의 재개 횟수를 계산하는 중

> ID     FirstDateofService   LastDateofService   PerformingProvider   등 (자세한 무관 행)
2,202           2012년 9월 18일           2012-09처럼 나타나는 -21           세인트 루크의
2202           2012년 9월 29일           2012년 10월 4일           세인트 루크의
4280           2012년 9월 19일           2012- 09-20           세 톤
,4280           2012년 9월 19일           2012년 10월 18일           시튼
4280           2012년 9월 21일           2012-10- 09           세 톤
4280           2012년 10월 10일           2012년 10월 17일           시튼
8980           2013년 6월 20일           2013-06- 24           덴튼 지역
2013-07-06       8980               2013-07-06           덴튼 지역

그리고 데이터에 계속적으로 간다.나는 재 입원의 수를 세는 쿼리를 쓰려고하는데 (ID 당 그것을하고 싶다), 재 입원은 30 일 또는 그 이하의 입원으로 동일한 병원에서 출입하는 것으로 구성된다. 나는 여러 가지 방법을 시도했지만 정확한 결과를 얻을 수 없습니다. 모든 제안을 부탁드립니다. 고맙습니다.

+0

여러 공급자를 방문 할 수 있습니까? 예를 들어 첫 번째 병원 A를 누른 다음 병원 B를 누른 다음 다시 A를 누릅니다. 그리고 세 번째는 첫 입학시 재입원으로 간주됩니까? 아니면 2 개의 재입고로 간주됩니까? – Wietze314

+0

어떤 데이터베이스입니까? – igr

답변

1

사람들은 퇴장 당일 다시 입원 할 수 없다고 가정합니다. 또한 Id는 일종의 환자 식별자라고 가정합니다.

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

대체하는 경우 : a1.LastDateOfService a2.FirstDateOfService로 지정하면 중복을 피하고 같은 날에 재전송을 허용합니다. 나는 그것이 일어날 것이라고 확신한다. – kmorris

+0

그것은 더 좋지만 누군가가 같은 날에 두 번 입원하고 풀려날 경우 여전히 실패 할 것이다. 정말로 기본 키 또는 생성 된 rowid – Laurence

+0

이 필요합니다. 우리가받은 데이터를 처리하고 있었고 당신은 입장마다 고유 한 키가 필요합니다. – 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; 

그러나 나는 당신의 데이터가 정화 될 필요가 생각합니다. 어떻게 id = 4280이 동일한 lastdayofservice (2012-09-19)를 갖지만 다른 lastdayofservice를 가지고 있습니까?

관련 문제