Парные данные Oracle SQL

Мне нужно найти разницу в средних значениях веса пациентов при разных посещениях (моменты времени), но я изо всех сил пытаюсь найти «парные» средние значения:

У меня есть 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

Спасибо и извините за такой новый вопрос.


person user3182246    schedule 29.01.2014    source источник


Ответы (1)


Вы можете сделать это с 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;
person Gordon Linoff    schedule 29.01.2014
comment
Это действительно здорово, спасибо! Я не знал, что могу присоединиться к одному столу! - person user3182246; 30.01.2014