Конкатные данные столбцов в БД postgres - PullRequest
0 голосов
/ 31 мая 2018

У меня есть запрос, который отображает данные следующим образом: -

t                    max_type   mean_type   min_type    std_type    sid
 2010-04-17 00:00:00 5.300       4.3372,     3.4000,     null        1      
 2010-04-17 00:00:00 5.3135      null        3.0365      0.3795      2

Я хочу отобразить данные примерно так: -

 t                      string_agg                 sid
'2010-04-17 00:00:00',  5.3000,4.3372,3.4000,        1
'2010-04-17 00:00:00',  5.3135,,3.0365,0.3795        2

Запрос используетсяя: -

SELECT m.measurement_at AS t,MAX(CASE mc.type WHEN 'max' THEN VALUE END) 
AS max_type,MAX(CASE mc.type WHEN 'mean' THEN VALUE END) AS mean_type,
MAX(CASE mc.type WHEN 'min' THEN VALUE END) AS min_type,MAX(CASE mc.type WHEN 'std' THEN VALUE END)
AS std_type,mc.sensor_id AS sId 
FROM flow.measure m
INNER JOIN flow.measure_col mc 
ON mc.id=m.measure_col_id 
INNER JOIN flow.sensors s 
ON s.id=mc.sensor_id WHERE s.station_id=1 
GROUP BY t,sId ORDER BY t

1 Ответ

0 голосов
/ 31 мая 2018

Это простая конкатенация строк:

select t,
       concat_ws(',', coalesce(max_type, ''), coalesce(mean_type, ''),
                 coalesce(min_type, ''), coalesce(std_type, '')
                ) as string_agg
       sid
from . . . ;

Вы должны быть осторожны с типами.Выше предполагается, что значения на самом деле являются строками (хотя они легко приводятся к строкам, если они не являются).

Вы можете построить свой запрос как:

SELECT m.measurement_at AS t,
       concat_ws(',',
                 coalesce(MAX(CASE mc.type WHEN 'max' THEN VALUE END)::text, ''),
                 coalesce(MAX(CASE mc.type WHEN 'mean' THEN VALUE END)::text, ''),
                 coalesce(MAX(CASE mc.type WHEN 'min' THEN VALUE END)::text, ''), 
                 coalesce(MAX(CASE mc.type WHEN 'std' THEN VALUE END)::text, '')
                ) as string_agg,
        mc.sensor_id AS sId 
FROM flow.measure m INNER JOIN
     flow.measure_col mc 
     ON mc.id = m.measure_col_id INNER JOIN
     flow.sensors s 
     ON s.id = mc.sensor_id
WHERE s.station_id = 1
GROUP BY t, sId
ORDER BY t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...