找到特定列的最大值,同时仍然看到其他列

对于表患者和实验室

patient
id  lastname
19  patientone
20  patienttwo

patientid   lastname    loinc   datetime            numerical  
19  patientone  4548-4  2014-05-15 00:00:00 6.5
19  patientone  4548-4  2015-05-15 00:00:00 7.5
19  patientone  4548-4  2016-05-15 00:00:00 3.5
19  patientone  4548-4  2017-05-15 00:00:00 5.5
19  patientone  5000-3  2018-05-15 00:00:00 123
20  patienttwo  4548-4  2013-05-15 00:00:00 2.5
20  patienttwo  4548-4  2012-05-15 00:00:00 1.5
20  patienttwo  4548-4  2011-05-15 00:00:00 9.5
20  patienttwo  4548-4  2010-05-15 00:00:00 3.5

Desired output:
patientid   lastname    datetime            numerical  
19  patientone  2017-05-15 00:00:00 5.5 
20  patienttwo  2013-05-15 00:00:00 2.5

labh 表保存实验室值(数字)、实验室类型(loinc)以及完成时间(日期时间)。我想查询 loinc=4548-4 的最新值,我希望输出显示日期和值。

我在下面试过这个,它显示了最近的日期,但我无法同时看到值(数字)。当我添加数字列时,它会显示所有值,而不仅仅是最近的值。

Select Distinct patient.id,patient.lastname,Max(Date_Trunc('day',labh.datetime)) As "Date" From  patient Inner Join labh On patient.id = labh.patientid Where labh.loinc = '4548-4' Group By patient.id,patient.firstname Order By patient.id
abcd491336492 回答:找到特定列的最大值,同时仍然看到其他列

您尚未在查询中选择数字列。您可以使用 CTE 临时存储数据,方法是根据患者 id 对 pratition 进行排名,并根据日期对每个分区进行排序。

所以,根据这个,你可以试试:

WITH summary AS (
SELECT  p.id as "Patient ID",p.lastname as "Patient Name",l.datetime As "Date",l.numerical as "Numerical",ROW_NUMBER() OVER (PARTITION BY p.id 
                             ORDER BY l.datetime DESC) AS rank
  FROM patient p
        Inner Join labh l 
        On p.id = l.patientid)

 SELECT     "Patient ID","Patient Name","Date","Numerical"
 FROM summary
 WHERE rank = 1;

这会给你:

患者 ID 患者姓名 日期 数字
19 患者一 2017-05-15T00:00:00.000Z 5.5
20 患者二 2013-05-15T00:00:00.000Z 2.5

更新

当您更新问题并更改期望时,修改后的查询将只是在 cte 构造中添加一个 where 条件:

WITH summary AS (
SELECT  p.id as "Patient ID",ROW_NUMBER() OVER (PARTITION BY p.id 
                             ORDER BY l.datetime DESC) AS rank
  FROM patient p
        Inner Join labh l 
        On p.id = l.patientid
        where l.loinc = '4548-4')             -- Added this line

 SELECT     "Patient ID","Numerical"
 FROM summary
 WHERE rank = 1;
    

这会给你同样的结果:

患者 ID 患者姓名 日期 数字
19 患者一 2017-05-15T00:00:00.000Z 5.5
20 患者二 2013-05-15T00:00:00.000Z 2.5
,

为了实现您在 Postgres(和其他 SQL RDBMS)中寻找的内容,您需要从本质上确定最大值及其相应的主键,然后将其与您正在寻找的其余数据集连接起来检索:

SELECT patient.*,labh.*
  FROM patient
  JOIN labh
    ON patient.id = labh.patientid
  JOIN (SELECT patientid,max(datetime)
          FROM labh
      GROUP BY patientid) maxvals
    ON maxvals.patientid = labh.patientid AND
       maxvals.datetime = labh.datetime
本文链接:https://www.f2er.com/65292.html

大家都在问