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查询带有条件的最新值的主要内容,如果未能解决你的问题,请参考以下文章

sql 存储过程带有模糊查询条件

sql左连接查询+右表带有条件的实现

重写 Oracle SQL 查询

SQL语句怎样进行数据库字段的条件查询?

带有 VB.net 变量字符串条件的动态 SQL 查询

显示最新不同数据的 SQL Server 查询