Как создать сводную статистику для каждой группы и перенести ее? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть две таблицы, как показано ниже

enter image description here

Я пытался что-то вроде ниже

select person_id,
   min(value),max(value),count(value),stddev(value)
   percentile_cont(0.25) within group (order by value_as_number asc) as "25pc",
   percentile_cont(0.75) within group (order by value_as_number asc) as "75pc"
from cdm.measurement
group by person_id

Если a person doesn't have a specific reading, the value should NA as shown in screenshot below

Я хотел бы сделать две вещи

1) Создать столько столбцов, сколько число чтений в таблице Readings (имеет только уникальные идентификаторы). Например, если таблица Чтений имеет 800 идентификаторов чтения, у нас будет 800 * 6 = 4800 столбцов для человека . 6 is used here because of min,max,count,stddev,25th percentile,75 percentile. Имя столбца будет R_name followed by 25%,75%,min,max etc. Пример: Read_1_25%, Read_1_min

2) Если у человека нет каких-либо показаний, его значение для пропущенных показаний будет NA. например, `person_id = 1 имеет только чтение R1. Поэтому остальные столбцы 4794 (4800 - 6) будут иметь значение NA

Я ожидаю, что мой результат будет таким, как показано ниже. Поскольку изображение широко, пожалуйста, нажмите на изображение, чтобы увеличить его. Игнорируйте правильность значений на моем скриншоте. формат - это то, что я ищу твоей помощи

enter image description here

1 Ответ

1 голос
/ 16 октября 2019

Если я правильно понимаю, вы можете использовать условное агрегирование:

select person_id,
       count(*) filter (where reading = 'R_1') as cnt_r_1,
       min(value) filter (where reading = 'R_1') as min_r_1,
       max(value) filter (where reading = 'R_1') as max_r_1,
       avg(value) filter (where reading = 'R_1') as avg_r_1,
       stdev(value) filter (where reading = 'R_1') as stdev_r_1,
       count(*) filter (where reading = 'R_2') as cnt_r_2,
       min(value) filter (where reading = 'R_2') as min_r_2,
       max(value) filter (where reading = 'R_2') as max_r_2,
       avg(value) filter (where reading = 'R_2') as avg_r_2,
       stdev(value) filter (where reading = 'R_2') as stdev_r_2,
       . . .
from t
group by person_id;
...