sql >> Databasteknik >  >> RDS >> PostgreSQL

Skapa array i SELECT

Detta borde göra susen:

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;

Returnerar:

  • ct_total :totalt antal b per a .
  • ct_distinct_b :antal distinkta b per a .
  • b_arr :array av b plus frekvens för b , sorterat efter frekvens av b .

Ordnad efter totalt antal b per a .

Alternativt kan du använda en ORDER BY klausul i det samlade anropet i PostgreSQL 9.0 eller senare. Gillar:

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;

Kan vara tydligare. Men det är vanligtvis långsammare. Och sortering av rader i en underfråga fungerar för enkla frågor som den här. Mer förklaring:



  1. mysql välj dynamiska radvärden som kolumnnamn, en annan kolumn som värde

  2. behöver hjälp med att optimera wordpress meta_query

  3. TO_CHAR(datetime) Funktion i Oracle

  4. MySQL JSON-lagring vs två tabeller