我有一个像这样的结果数据库
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?
答案 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