PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggrega una singola colonna nella query con molte colonne

Richiesta semplice

Questo può essere molto più semplice con PostgreSQL 9.1 o versioni successive . Come spiegato in questa risposta strettamente correlata:

  • PGError:ERROR:aggregati non consentiti nella clausola WHERE su una query AR di un oggetto e dei suoi has_many objects

È sufficiente GROUP BY la chiave primaria di un tavolo. Da:

foo1 è una chiave primaria

.. puoi semplificare il tuo esempio in:

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!

Query con più tabelle

Tuttavia, dal momento che hai:

molti più campi e LEFT JOIN, la parte importante è che tutti questi campi hanno una relazione da 1 a 1 o da 1 a 0 tranne un campo che va da 1 a n che voglio aggregare

.. dovrebbe essere più rapido e semplice prima aggregare, poi unirti :

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 ...

In questo modo gran parte della tua query non ha bisogno di aggregazione.

Di recente ho fornito un test case in un SQL Fiddle per dimostrare il punto in questa risposta correlata:

  • PostgreSQL:ordine per array

Poiché ti riferisci a questa risposta correlata:No, DISTINCT non aiuterà affatto in questo caso.