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

find max value for specific column while still seeing other columns

对于table的患者和实验室

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 table 保存实验室值(数字)、实验室类型 (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.lastname, patient.firstname Order By patient.id

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

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

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;

这会给你:

Patient ID Patient Name Date Numerical
19 patientone 2017-05-15T00:00:00.000Z 5.5
20 patienttwo 2013-05-15T00:00:00.000Z 2.5

更新

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

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
        where l.loinc = '4548-4')             -- Added this line

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

这会给你相同的结果:

Patient ID Patient Name Date Numerical
19 patientone 2017-05-15T00:00:00.000Z 5.5
20 patienttwo 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