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

Agregar uma única coluna na consulta com muitas colunas

Consulta simples


Isso pode ser muito mais simples com PostgreSQL 9.1 ou posterior . Conforme explicado nesta resposta intimamente relacionada:
  • PGError:ERROR:agregações não permitidas na cláusula WHERE em uma consulta AR de um objeto e seus objetos has_many

Basta GROUP BY a chave primária de uma mesa. Desde a:

foo1 é uma chave primária

.. você pode simplificar seu exemplo para:
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
FROM   tbl1
GROUP  BY 1
ORDER  BY foo7, foo8;  -- have to be spelled out, since not in select list!

Consulta com várias tabelas


No entanto, desde que você tenha:

muitos mais campos e LEFT JOINs, a parte importante é que todos esses campos têm relação de 1 para 1 ou 1 para 0, exceto um campo que é 1 para n que eu quero agregar

.. deve ser mais rápido e simples agregar primeiro, juntar depois :
SELECT t1.foo1, t1.foo2, ...
     , t2.bar1, t2.bar2, ...
     , a.aggregated_col 
FROM   tbl1 t1
LEFT   JOIN tbl2 t2 ON ...
...
LEFT   JOIN (
   SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
   FROM   agg_tbl a ON ...
   GROUP  BY some_id
   ) a ON a.some_id = ?.some_id
ORDER  BY ...

Dessa forma, a grande parte da sua consulta não precisa de agregação.

Recentemente, forneci um caso de teste em um SQL Fiddle para provar o ponto nesta resposta relacionada:
  • PostgreSQL - ordena por uma matriz

Como você está se referindo a esta resposta relacionada:Não, DISTINCT não vai ajudar em nada neste caso.