Postgres — Объединение сгруппированных строк в одну строку для вставки

#sql #postgresql

Вопрос:

У меня есть некоторые данные из запроса, и форма в значительной степени выглядит так:

 | Id | category | value |
|----|----------|-------|
| 1  | 'a'      |  2    |
| 1  | 'b'      |  5    |
| 2  | 'a'      |  3    |
| 2  | 'b'      |  4    |
 

Я хочу сгруппировать эти данные и вставить их в таблицу следующей структуры

 | Id | category_a_value | category_b_value|
|----|------------------|-----------------|
|  1 |       2          |          5      |
| 2  |       3          |          4      |
 

Есть ли хороший способ добиться этого в Постгресе? Я не мог понять, как сгруппировать данные так, как я хотел, поэтому в конце концов я попробовал INSERT INTO выбрать и on conflict выбрать из исходного запроса, но это не удалось, потому что вы не можете влиять на строку несколько раз.

Заранее спасибо

Ответ №1:

Вы можете использовать условную агрегацию, которая в Postgres использует filter :

 select id,
       max(value) filter (where category = 'a') as category_a_value,
       max(value) filter (where category = 'b') as category_b_value
from t
group by id;
 

Затем вы можете insert . . . select вставить результаты в существующую таблицу.

Комментарии:

1. Ух ты, это блестяще. Я не ожидал такого прямого ответа. Большое спасибо.