#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. Ух ты, это блестяще. Я не ожидал такого прямого ответа. Большое спасибо.