条件:PostgreSQL 8.4(这对 9.x 来说太简单了)
桌子:
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;
所以我试着把这个作为我正在做的事情的一个例子——不,我没有一个具有这种结构的实际表,它的规范化程度并不高,但我确实有一个子查询会产生这样的东西。
实际上,我的 array_agg() 也连接了两个字段(一个单词和一个数字)并且我按数字 eg( array_agg(CASE ... THEN foo || ' - ' || bar
) 排序,不幸的是我的输出只是大部分排序。如果我有更多时间,也许我可以改进这个问题。