查找特定列的最大值,同时仍能看到其他列
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
对于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