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

Array in SELECT erstellen

Das sollte funktionieren:

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;

Rückgabe:

  • ct_total :Gesamtanzahl von b pro a .
  • ct_distinct_b :Anzahl unterschiedlicher b pro a .
  • b_arr :Array von b plus Häufigkeit von b , sortiert nach Häufigkeit von b .

Geordnet nach der Gesamtzahl von b pro a .

Alternativ können Sie einen ORDER BY verwenden -Klausel innerhalb des Aggregataufrufs in PostgreSQL 9.0 oder höher. Wie:

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;

Kann klarer sein. Aber es ist normalerweise langsamer. Und das Sortieren von Zeilen in einer Unterabfrage funktioniert für einfache Abfragen wie diese. Weitere Erklärung: