Изменение формы результатов запроса в чистом PostgreSQL - PullRequest
1 голос
/ 30 апреля 2019

У меня есть таблица результатов SQL-запроса, подобная этой:

Date,metric,value
1,x,2
2,x,3
2,y,5
3,y,8
3,z,9

И я хотел бы получить сумму по дням для каждой метрики (заполняется 0, когда ее нет):

Date,x,y,z
1,2,0,0
2,3,5,0
3,0,8,9

Я не знаю заранее названия метрик.В данный момент я загружаю результаты в python и изменяю их форму с помощью панд, но наверняка есть способ PostgreSQL сделать это.

Как добиться вышеизложенного в PostgreSQL?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

вы можете использовать кросс-таблицу

 select * from crosstab('select date, metric ,value from metric_table order by date, metric ,value '
                       ,'select  metric from metric_table group by metric  order by metric') 
                  as ct( date integer ,y integer,x integer, z integer);

Но будьте осторожны, "as ct( date integer ,y integer,x integer, z integer)" часть должна динамически создаваться перед вызовом запроса, основываясь на "select metric from metric_table group by metric order by metric" наборе результатов

0 голосов
/ 30 апреля 2019

вы можете использовать conditional aggregation с case when expression

select date, 
       max(case when metric='x' then value end) as x,
       max(case when metric='y' then value end) as y,
       max(case when metric='z' then value end) as z
from tablename
group by date
...