PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Criar array em SELECT


Isso deve fazer o truque:
SELECT a
     , sum(ab_ct)::int AS ct_total
     , count(*)::int   AS ct_distinct_b
     , array_agg(b || ', ' || ab_ct::text) AS b_arr
FROM  (
    SELECT a, b, count(*) AS ab_ct
    FROM   tbl
    GROUP  BY a, b
    ORDER  BY a, ab_ct DESC, b  -- append "b" to break ties in the count
    ) t
GROUP  BY a
ORDER  BY ct_total DESC;

Devoluções:
  • ct_total :contagem total de b por a .
  • ct_distinct_b :contagem de b distintos por a .
  • b_arr :array de b mais frequência de b , classificado por frequência de b .

Ordenado pela contagem total de b por a .

Como alternativa, você pode usar um ORDER BY cláusula dentro da chamada agregada no PostgreSQL 9.0 ou posterior. Curti:
SELECT a
     , sum(ab_ct)::int AS ct_total
     , count(*)::int   AS ct_distinct_b
     , array_agg(b || ', ' || ab_ct::text ORDER BY a, ab_ct DESC, b) AS b_arr
FROM  (
    SELECT a, b, count(*) AS ab_ct
    FROM   tbl
    GROUP  BY a, b
    ) t
GROUP  BY a
ORDER  BY ct_total DESC;

Pode ser mais claro. Mas normalmente é mais lento. E classificar linhas em uma subconsulta funciona para consultas simples como esta. Mais explicação: