Oracle SQL配对数据

时间:2014-01-29 19:49:34

标签: sql oracle subquery difference

我需要找到不同访问时间点(时间点)患者体重之间的平均值差异,但我很难找到“配对”平均值:

我有1个表(PHYS),其中包含不同访问时的患者体重:

PATIENT    VISIT       WEIGHT
1          Baseline    200
1          1 Month     190
1          2 Month     170
2          Baseline    300
2          1 Month     290
2          2 Month     280
3          Baseline    250
3          1 Month     230

我的问题是我只想找到配对数据的区别。例如,在计算2个月和基线访问之间的体重减轻量时,我想找到(平均2个月体重)和(仅2个月体重的患者的平均基线体重)之间的差异。在这个例子中,结果应该是AVG(170,280) - AVG(200,300)= -25(因为只有患者1和2有2个月的权重)。

这是我所拥有的,但它根据所有权重计算差异:

SELECT VISIT
  AVG(WEIGHT)
  -
(SELECT
  AVG(WEIGHT)
  FROM PHYS
  WHERE VISIT = 'BASELINE')
FROM PHYS
GROUP BY VISIT

我想要的输出是(我知道我需要添加ORDER BY):

VISIT      CHANGE FROM BASELINE
Baseline   0
1 Month    -13.3
2 Month    -25

谢谢你,对不起这个新问题。

1 个答案:

答案 0 :(得分:0)

您可以使用join对同一个表执行此操作,但仅适用于'Baseline'。然后,聚合仅聚合匹配的值,因此您应该获得三个组的不同基线平均值(因为群体不同):

select p.visit, avg(p.weight) as avg_weight, avg(pbl.weight) as avg_blweight,
       (avg(p.weight) - avg(pbl.weight)) as change
from phys p join
     phys pbl
     on p.patient = pbl.patient and
        pbl.visit = 'Baseline'
group by p.visit;