必要な機能:
CREATE OR REPLACE FUNCTION sortCountLimitOffset(anyarray, int, int)
RETURNS anyarray AS 'select array_agg(x) from (select x from (select unnest($1) as x) as t group by x order by count(*) desc offset $2 limit $3) t;'
LANGUAGE sql VOLATILE
COST 100;
解決策 1: (文字列として連結されたすべての文字を返す)
select
usr,
array_to_string(sortCountLimitOffset(array_agg(letter), 0, 5), ',')
from ttt
group by usr;
出力:
usr | array_to_string
-----+-----------------
1 | B,A,C
2 | C,B,A
(2 Zeilen)
解決策 2: (n 番目の文字をそれぞれ別の列に返す)
select
usr,
array_to_string(sortCountLimitOffset(array_agg(letter), 0, 1), ',') letter1,
array_to_string(sortCountLimitOffset(array_agg(letter), 1, 1), ',') letter2,
array_to_string(sortCountLimitOffset(array_agg(letter), 2, 1), ',') letter3,
array_to_string(sortCountLimitOffset(array_agg(letter), 3, 1), ',') letter4,
array_to_string(sortCountLimitOffset(array_agg(letter), 4, 1), ',') letter5
from ttt
group by usr;
出力:
usr | letter1 | letter2 | letter3 | letter4 | letter5
-----+---------+---------+---------+---------+---------
1 | B | A | C | |
2 | C | B | A | |
(2 Zeilen)
関数が呼び出される関数から SELECT をインライン化することも可能です。しかし、現在の方法では、コードの再利用と保守が容易になっています。