sql >> Database >  >> RDS >> PostgreSQL

Maak een array in SELECT

Dit zou het moeten doen:

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;

Retourneren:

  • ct_total :totaal aantal b per a .
  • ct_distinct_b :aantal verschillende b per a .
  • b_arr :array van b plus frequentie van b , gesorteerd op frequentie van b .

Geordend op totaal aantal b per a .

Als alternatief kunt u een ORDER BY gebruiken clausule binnen de geaggregeerde aanroep in PostgreSQL 9.0 of hoger. Vind ik leuk:

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;

Mag duidelijker zijn. Maar het is meestal langzamer. En het sorteren van rijen in een subquery werkt voor eenvoudige query's zoals deze. Meer uitleg:



  1. Binaire gegevens invoegen in MySQL (zonder PreparedStatement's)

  2. hoe stuur ik een sms via orakel 11g? klant is pad en in India moet ik sms'en

  3. SQL Server SP - Passparameter voor IN-arraylijst?

  4. MySQL Meerdere tellingen in één query