Postgres: альтернативные функции кросс-таблицы - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть такая таблица:

ID | Value
------------
1  | ABC
1  | DEF
1  | GHI
2  | JKL
2  | MNO

Я ищу такой вывод:

ID | Column1 | Column2 | Column3
----------------------------------
1  |   ABC   |   DEF   |   GHI     
2  |   JKL   |   MNO   |   NULL

Есть ли способ добиться этого в Postgres без использования функция кросс-таблицы?

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

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

select id, 
       max(value) filter (where seq = 1) as col1,
       max(value) filter (where seq = 2) as col2,
       max(value) filter (where seq = 3) as co3
from(select t.*, row_number() over (partition by id order by value) as seq
     from table t
    ) t
group by id;
0 голосов
/ 29 апреля 2020

Вы можете использовать оператор case. здесь демо .

select
    id,
    max(case when value in ('ABC', 'JKL') then value end) as column1,
    max(case when value in ('DEF', 'MNO') then value end) as column2,
    max(case when value in ('GHI') then value end) as column3
from myTable
group by
    id
order by
    id

Выход:

id | column1 | column2 | column3
----------------------------------
1  |   ABC   |   DEF   |   GHI     
2  |   JKL   |   MNO   |   null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...