Perl + PostgreSQL - выборочная перестановка столбцов в строки - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь найти способ использовать Perl для дальнейшей обработки вывода PostgreSQL. Если есть лучший способ сделать это через PostgreSQL, пожалуйста, дайте мне знать. В основном мне нужно выбрать определенные столбцы (Realtime, Value) в файле, чтобы объединить определенные столбцы и создать строку, сохраняя при этом ID и CAT.

При первой публикации, пожалуйста, дайте мне знать, если я что-то пропустил.

Введите:

ID  CAT   Realtime  Value
A   1    time1       55
A   1    time2       57
B   1    time3       75
C   2    time4       60
C   3    time5       66
C   3    time6       67

Выход:

ID  CAT  Time                   Values
A   1    time 1,time2           55,57
B   1    time3                  75
C   2    time4                  60
C   3    time5,time6            66,67

Ответы [ 2 ]

2 голосов
/ 22 января 2012
SELECT id
     , cat
     , string_agg(realtime, ',') AS realtimes
     , string_agg(value, ',') AS values
FROM   input
GROUP  BY 1, 2
ORDER  BY 1, 2;

string_agg() требует PostgreSQL 9.0 или новее и объединяет все значения в строку, разделенную разделителем - в то время как array_agg() (v8.4 +) создает массив am из входных значений.


О 1, 2 - я цитирую руководство по команде SELECT:

GROUP BY пункт

выражение может быть именем входного столбца или именем или порядковым номером выходного столбца (элемент списка SELECT) или ...

ORDER BY пункт

Каждое выражение может быть именем или порядковым номером выходного столбца. (ВЫБРАТЬ элемент списка) или

Акцент мой. Так что это просто условное обозначение. Особенно удобно со сложными выражениями в списке SELECT.

2 голосов
/ 22 января 2012

Вы можете сделать это проще всего в Postgres следующим образом (используя столбцы массива)

CREATE TEMP TABLE output AS SELECT
  id, cat, ARRAY_AGG(realtime) as time, ARRAY_AGG(value) as values
  FROM input GROUP BY id, cat;

Затем выберите все, что вы хотите, из выходной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...