PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Aggregieren Sie eine einzelne Spalte in einer Abfrage mit vielen Spalten

Einfache Abfrage

Dies kann viel einfacher sein mit PostgreSQL 9.1 oder höher . Wie in dieser eng verwandten Antwort erläutert:

  • PGError:FEHLER:Aggregate sind in WHERE-Klausel bei einer AR-Abfrage eines Objekts und seiner has_many-Objekte nicht zulässig

Es genügt GROUP BY der Primärschlüssel eines Tisches. Seit:

foo1 ist ein Primärschlüssel

.. können Sie Ihr Beispiel vereinfachen zu:

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!

Abfrage mit mehreren Tabellen

Da Sie jedoch:

viele weitere Felder und LEFT JOINs, der wichtige Teil ist, dass alle diese Felder eine 1-zu-1- oder 1-zu-0-Beziehung haben, mit Ausnahme eines Felds, das 1-zu-n ist, das ich aggregieren möchte

.. es sollte schneller und einfacher sein, zuerst zu aggregieren, später beizutreten :

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

Auf diese Weise muss der große Teil Ihrer Abfrage überhaupt nicht aggregiert werden.

Ich habe kürzlich einen Testfall in einer SQL-Geige bereitgestellt, um den Punkt in dieser verwandten Antwort zu beweisen:

  • PostgreSQL - Sortieren nach einem Array

Da Sie sich auf diese verwandte Antwort beziehen:Nein, DISTINCT wird in diesem Fall überhaupt nicht helfen.