Условия: PostgreSQL 8.4 (это было бы слишком просто с 9.x)PostgreSQL: Каков наилучший способ сортировки нескольких array_agg() с разными условиями?
Таблица:
id | gpa | class | rank
----+-----+---------+--------
1 | 2.0 | english | low
1 | 2.0 | math | low
1 | 2.0 | pe | low
1 | 2.0 | spanish | medium
2 | 3.5 | english | high
2 | 3.5 | history | high
2 | 3.5 | art | great
2 | 3.5 | tech | high
3 | 4.0 | pe | medium
3 | 4.0 | spanish | high
3 | 4.0 | english | great
3 | 4.0 | art | great
Требуются:
id | gpa | great | high | medium | low
----+-----+--------------+------------------------+---------+-----
1 | 2.0 | | | spanish | english, math, pe
2 | 3.5 | art | english, history, tech | |
3 | 4.0 | art, english | spanish | pe |
Текущий метод:
WITH details AS (
select * from table order by rank, class
)
SELECT id
, gpa
, array_to_string(array_agg(CASE WHEN rank='great' THEN class END,', ')) as great
, array_to_string(array_agg(CASE WHEN rank='high' THEN class END,', ')) as high
, array_to_string(array_agg(CASE WHEN rank='medium' THEN class END,', ')) as medium
, array_to_string(array_agg(CASE WHEN rank='low' THEN class END,', ')) as low
FROM details
ORDER BY gpa;
Так Я попытался привести это в качестве примера из того, что я делаю - нет, у меня нет фактическая таблица с этой структурой, которая не очень нормализована, но у меня есть подзапрос, который производит что-то вроде этого.
В действительности мой массив_agg() также объединяет два поля (слово и число), и я сортирую по числу, например (array_agg(CASE ... THEN foo || ' - ' || bar
), к сожалению, мой вывод только в основном отсортирован. Возможно, я смогу улучшить этот вопрос, если у меня будет больше времени.
Итак, это то, о чем я изначально думал, но разве у него не было бы большого успеха? Он запускает 4 запроса для каждой записи. – vol7ron
Привет @ vol7ron, вы правы. Это не самый лучший вариант из-за огромного успеха. Однако я читал, что, возможно, у вас нет разрешения на создание функции. Если вы подтвердите, что у вас есть это, я могу написать другие варианты с лучшей производительностью. – doctore
@ vol7ron, я просто обновляю ответ вторым запросом с лучшей производительностью. – doctore