寻找具有良好血压控制的患者

时间:2010-11-02 18:57:01

标签: sql

我有一个像这样的结果数据库

patient integer
rdate date
rvalue integer
rtype vchar

患者在给定日期进行(0 ... n)血压测量。我需要找到那些最后一次就诊的患者,包括血压测量,并且在那次就诊时,舒张压<&lt; 90和收缩压<&lt; 140。

我可以像上次检查一样只检查收缩压测量

select patient, max(rdate) as maxdate 
from results 
where rtype = 'systolic' and rvalue > 0 
group by patient

如何选择min(rvalue)&lt; 140?

5 个答案:

答案 0 :(得分:2)

尝试:

select r.patient, max(r.rdate) as maxdate 
FROM results as R
INNER JOIN results as R2 ON r2.Patient=r.patient AND r.rdate=r2.rdate
WHERE r.type='systolic' and r.rvalue BETWEEN 0 and 140
AND r2.type='diastolic' and r2.rvalue BETWEEN 0 and 90
GROUP BY r.patient

这是一个自我联接,只返回同一日期同一患者的两种血压测量类型的行(基于联接标准)。

答案 1 :(得分:1)

我认为这将为您提供患者列表和符合标准的最后一次访问日期

SELECT patient, MAX(rdate) AS max_rdate
FROM (
     SELECT patient, rdate, MIN(CASE WHEN RTYPE = 'systolic'  THEN rvalue END) AS min_systolic, 
        MIN(CASE WHEN RTYPE = 'diastolic' THEN rvalue END) AS min_diastolic
    FROM BPResults
    GROUP BY patient, rdate
    ) AS results
WHERE min_systolic < 140
    AND min_diastolic < 90
GROUP BY patient

答案 2 :(得分:1)

(第一种方法 - 见背景信息的第二种方法)

JNK的答案很接近,除了一件事。它没有回答你的问题。

它会告诉您患者最后一次患有良好的bp控制,即使之后有不良患者。事实上,它根本不会考虑任何坏bp。它排除了他们。

格雷厄姆,我有两种解决这个问题的方法。

让我们澄清你想要的问题。

我认为您只希望患者在最后一次测量时具有良好的血压控制,其中舒张压小于90且收缩压小于140。 第一种方法。将表格连接到自身,以获得最后一次测量时的最佳舒张压和收缩压测量值,并在它是一个良好的bp时报告。

select     dia.patient       as patient   
     ,     dia.rdate         as bp_date   
     , min(dia.rvalue)       as dia_bp          -- best dia bp for that date
     , min(sys.rvalue)       as sys_bp          -- best sys bp for that date
  from results  dia
     , results  sys 
 where dia.patient            = sys.patient
   and dia.rdate              = sys.rdate       -- both bp on same date
   and dia.rtype              = 'diastolic'
   and sys.rtype              = 'systolic'
 group by dia.patient
        , dia.rdate
  having min(dia.rvalue)     <   90             -- under 90 bp
     and min(sys.rvalue)     <  140             -- under 140 bp
     and dia.rdate            =                 -- and that date is
       ( select max(lst.rdate)                  -- the last date
           from results   lst
          where lst.patient   = dia.patient     -- for that patient
            and lst.rtype    in ( 'diastolic'   -- with a bp row
                                , 'systolic' ) )

这将返回所有良好的舒张压和收缩压。但患者必须在同一天同时患有舒张压和收缩压,否则这将忽略只有一个bp的人。但是,我的第二种方法可以解决这个问题。

答案 3 :(得分:1)

(第二种方法 - 请参阅我的第一种背景信息方法)。

我的第一种方法只会返回同一天发生舒张压和收缩压的行。它将忽略任何只有一个或另一个(不是两个)的行。如果要将这些行包含在查询中,可以采用第二种方法:

select     bp.patient   
     ,     bp.rdate                              -- the latest bp date
     ,     bp.rtype   
     , min(bp.rvalue)                            -- best bp for that date
  from results    bp 
 where bp.rtype   in ('diastolic', 'systolic')
   and bp.rdate    =                             -- and the bp date is
     ( select max(lst.rdate)                     -- the last bp date 
         from results  lst                   
        where lst.patient  = bp.patient          -- for that patient
          and lst.rtype   in ( 'diastolic'       -- in which there is a bp row
                             , 'systolic' ) )
 group by bp.patient
        , bp.rdate
        , bp.rtype
   having (    min(bp.rvalue)    <   90          -- under 90 bp
           and     bp.rtype       = 'diastolic') -- when diastolic
       or (    min(bp.rvalue)    <  140          -- or under 140 bp
           and     bp.rtype       = 'systolic' ) -- when systolic

这将为您提供最后的bp测量值(舒张压,收缩压或两者)。然后,每位患者将有一到两行。

这种方法的主要优点是它将包括任何患有舒张期或收缩期或结果两者的患者。在同一天有多个bp测量值的情况下,此查询将仅返回最佳(最低)测量值。

就我个人而言,我最喜欢这种解决方案,因为它为您提供了许多不同组合的最大灵活性(就不同日期的单次bp测量而言)。

希望你能找到适合自己的产品!

答案 4 :(得分:0)

这几乎是我想要的......但Firebird不支持交叉。

select patient, max(rdate) as ldate from digital 
where rtype = 'Diastolic' and  RDATE between (?) and (?) 
group by patient

intersect

select patient, rdate as ldate from digital 
where rtype = 'Diastolic' and RDATE between (?) and (?) 
and rvalue < 90

intersect 

select patient, rdate as ldate as digital where rtype = 'Systolic'  and
     

(?)和(?)之间的RDATE       和rvalue&lt; 140