2017-09-29 3 views
0

해당 행의 날짜 (Discharge_Dt)에서 지난 30 일을 동적으로 참조하는 데이터 집합의 각 레코드에 대해 Patient_ID로 MIN 날짜를 계산하려고합니다. 나의 초기 생각은 창 함수를 사용하는 것이었지만, 나는 가까운 서브 쿼리를 선택했다. 그러나 내가 필요한 것은 아니다.SQL에서 롤링 기간 내의 레코드에 대한 MIN 값을 식별하는 방법

내 샘플 쿼리에는 MIN Discharge_Dt를 지난 30 일로 제한하는 로직이 없습니다. 즉, 주어진 행에 대해 30 일 이상 경과 한 MIN Discharge_Dt를 원하지 않습니다.

예제 쿼리 :

SELECT Patient_ID, 
     Discharge_Dt, 

     /* Calculating the MIN Discharge_Dt by Patient_ID for the last 30 
     days based upon the Discharge_Dt for that row */ 

     (SELECT MIN(Discharge_Dt) 
     FROM admissions_ds AS b 
     WHERE a.Patient_ID = b.Patient_ID AND 
      a.Discharge_Dt >= DATEADD('D', -30, GETDATE())) AS MIN_Dt 

FROM admissions_ds AS a 

원하는 출력 표 :

여기
Patient_ID | Discharge_Dt | MIN_Dt  
10   | 2017-08-15 | 2017-08-15   
10   | 2017-08-31 | 2017-08-15   
10   | 2017-09-21 | 2017-08-31   
15   | 2017-07-01 | 2017-07-01   
15   | 2017-07-18 | 2017-07-01    
20   | 2017-05-05 | 2017-05-05   
25   | 2017-09-24 | 2017-09-24 
+1

실제로 사용하는 dbms는 어느 것입니까? 이 쿼리는 실제로 PostgreSQL과 MS SQL Server 모두에서 실행됩니까? – jarlh

+1

출력 옆에도 간단한 데이터를 추가 할 수 있습니까? –

+0

@jarlh, Amazon Redshift를 사용하고 있지만이 문제에 대한 구문은 dbms간에 다소 유사해야하므로 내 질문에 더 많은 잠재 고객이 도달 할 수 있기를 기대하면서 SQL Server를 포함 시켰습니다. – izzy84

답변

0

가고, 는 그냥 단순이 필요 조인.

drop TABLE if EXISTS admissions_ds; 
create table admissions_ds (Patient_ID int,Discharge_Dt date); 
insert into admissions_ds 
values 
    (10,'2017-08-15'), 
    (10,'2017-08-31'), 
    (10,'2017-09-21'), 
    (15,'2017-07-01'), 
    (15,'2017-07-18'), 
    (20,'2017-05-05'), 
    (25,'2017-09-24'); 

select t1.Patient_ID,t1.Discharge_Dt,min(t2.Discharge_Dt) as min_dt 
from admissions_ds as t1 
join admissions_ds as t2 on t1.Patient_ID=t2.Patient_ID and t2.Discharge_Dt > t1.Discharge_Dt - interval '30 days' 
group by 1,2 
order by 1,2 
; 
+0

완벽하게 작동했습니다! 고맙습니다! – izzy84