选择第一个和最后一个测试组Labtests

问题描述:

我有一个表PatientLab我有一组测试如下选择第一个和最后一个测试组Labtests

patientid labtest  dateordered result 
100   cd4   1/1/14   500 
100   cd4   1/4/14   200 
100   cd4   1/5/15   800 
100   vl   1/4/14   564 
200   cd4   1/5/16   455 
200   cd4   1/6/16   678 
200   cd4   1/7/16   234 
200   cd4   1/8/16   356 
200   vl   1/7/16   1000 

我想要的结果的;

patientid FirstCD4  FirstCD4Date  LastCD4  LastCD4Date 
100   500   1/1/14   800   1/5/15 
200   455   1/5/16   356   1/8/16 

正在使用PostgreSQL 9

+1

你尝试过什么呢? – etsa

+0

我试图'选择patientid,dateordered,导致从PatientLab 其中(patientid)IN( 选择patientid,最大值(dateordered)从PatientLab AS dateordered 其中LABTEST = 'CD4' 组由patientid )'是能够只能得到最大值,但无法同时从最大值和最小值中获得最大值和最小值 –

+0

对于患者只有一个CD4的情况,我们是否还应该包括一行以及我们所拥有的细节?对于那些没有CD4的人也一样吗? – toonice

with CTE as 
(
select p1.*, 
     row_number() over(partition by patientid order by dateordered asc) as r1, 
     row_number() over(partition by patientid order by dateordered desc) as r2 
from PatientLab p1 
where labtest = 'cd4' -- Case sensitive, thanks etsa 
) 
select C1.PatientID, 
     C1.result as FirstCD4, 
     C1.dateordered as FirstCD4Date, 
     C2.result as LastCD4, 
     C2.dateordered as LastCD4Date 
from CTE C1 
inner join CTE C2 
on C1.PatientID = C2.PatientID 
where C1.r1 = 1 
and C2.r2 = 1 
+0

它在SQL Server 2012中运行良好,但是无法在postgresql 9中复制此任何想法? @JohnHC –

+0

@ Shark-NeilFelyx窗口函数和CTE都应该在Postgres中工作,你会得到任何错误还是只是没有数据? – JohnHC

+0

我同意@JohnHC:它也应该在Postgresql中工作。 – etsa

您可以使用最小和最大

select a.patientid, min(a.result) as FirstCD4, min(dateordered) as FirstCD4Date 
    , max(a.result) as LastCD4, max(dateordered) as LastCD4Date 
    from (
select * from yourpatient where labtest = 'cd4') a 
group by a.patientid; 

你的表和细节Code

+0

结果与预期的结果不一样,有时最短的日期可以有最大的结果。日期和结果是独立的。即这是不是最小日期必须有最小结果的条件 –