SQL查询带有条件的最新值
Posted
技术标签:
【中文标题】SQL查询带有条件的最新值【英文标题】:SQL query most recent value with conditions 【发布时间】:2021-03-21 08:29:51 【问题描述】:又一次尝试,我第一次写了一个糟糕的问题。我希望这会更好。
我有 2 个表格 - 患者和临床参数:
PATIENT
ID Last First
190 Smith Frank
191 Smith Flo
CLINICALPARAMETERH
SBP DBP Datetime PatientID
124 86 2020-07-13 13:49:05 190
144 86 2020-08-13 13:49:05 190
134 96 2020-08-13 13:49:05 190
120 89 2009-07-13 13:49:05 190
132 76 2009-07-13 13:49:05 190
122 76 2020-07-13 13:49:05 191
我要看看
ID Last First
我希望仅在以下情况下看到这一点:1) SBP
因此,如果它来自 >1 年前,或者不是最近的读数,或者 SBPis >139 或 DBPis >89,则不应列入列表。 (所以在这个例子中,它会显示 Flo 的名字,而不是 Frank,但因为他最近的名字超出了范围)
任何帮助将不胜感激,谢谢。希望我解释了我在寻找什么。
【问题讨论】:
您能否根据您的示例数据添加预期的输出?不仅是列标题,还有实际值? 用您正在使用的数据库标记您的问题。 很遗憾,我不确定 - 这是电子病历的查询区域。一般来说,当我四处搜索时,我发现一些 SQL 命令不起作用,但我已经能够找出在我的系统中有效的替代方法。 【参考方案1】:好吧,您可以使用相关子查询来获取最近的日期。剩下的就是过滤。在标准 SQL 中,您可以这样做:
select p.*, cph.*
from patient p join
CLINICALPARAMETERH cph
on p.id = cph.patientid
where pch.datetime = (select max(cph2.datetime)
from CLINICALPARAMETERH cph2
where cph2.patientId = cph.patientId
) and
pch.datetime > current_date - interval '1 year' and
pch.SBP < 140 and
pch.DBP < 90;
众所周知,日期/时间函数依赖于数据库,因此确切的语法可能因您实际使用的数据库而异。
【讨论】:
我在此看到重复 - 患者列出了不止一次,有不止一个日期/阅读。不仅仅是最近的日期 关联子句应该在“专利”而不是“日期”上。我修好了。【参考方案2】:您可以rank()
按时间降序排列的患者去年的数据。然后,您可以仅过滤排名第一且具有您所追求的值的那些。存在此类记录的患者就是您想要的患者。因此,您可以使用带有EXISTS
的相关子查询来过滤它们。
SELECT p.id,
p.last,
p.first
FROM patient p
WHERE EXISTS (SELECT *
FROM (SELECT cp.sbp,
cp.dbp,
cp.patientid,
rank() OVER (PATITION BY cp.patientid
ORDER BY cp.datetime DESC) r
FROM clinicalparameterh cp
WHERE cp.datetime >= now - INTERVAL 1 YEAR) x
-- ^ this might vary ^
-- depending on your
-- actual DBMS
WHERE x.patentid = p.id
AND x.sbp < 140
AND x.dbp < 90
AND x.r = 1);
【讨论】:
【参考方案3】:一个选项使用窗口函数:
select p.*, c.*
from patient p
inner join (
select c.*,
row_number() over(partition by patientid order by datetime desc) rn
from clinicalparameterh c
) c on c.patientid = p.id
where
c.rn = 1
and c.sbp < 140
and c.dbp < 90
and c.datetime > current_date - interval '1' year
日期函数因数据库而异,因此最后一个条件的拼写可能因您使用的产品而异:查询使用标准 ANSI SQL 语法。
【讨论】:
以上是关于SQL查询带有条件的最新值的主要内容,如果未能解决你的问题,请参考以下文章