【问题标题】:SQL query most recent value with conditionsSQL查询带有条件的最新值
【发布时间】: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 命令不起作用,但我已经能够找出在我的系统中有效的替代方法。

标签: sql datetime inner-join greatest-n-per-group


【解决方案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 语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2021-12-27
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      相关资源
      最近更新 更多