sql >> Databáze >  >> RDS >> PostgreSQL

Vytvořte pole v SELECT

Tohle by mělo stačit:

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;

Vrátí:

  • ct_total :celkový počet b za a .
  • ct_distinct_b :počet různých b za a .
  • b_arr :pole b plus frekvence b , seřazené podle frekvence b .

Seřazeno podle celkového počtu b za a .

Případně můžete použít ORDER BY klauzule v rámci souhrnného volání v PostgreSQL 9.0 nebo novějším. Jako:

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;

Může být jasnější. Ale obvykle je to pomalejší. A řazení řádků v poddotazu funguje pro jednoduché dotazy, jako je tento. Další vysvětlení:



  1. Získávání dat pole mysql po kliknutí na odkaz?

  2. Příkaz aktualizace Oracle se skupinovou funkcí

  3. Vložte obrázek do databáze pomocí php

  4. Oracle SQL vkládá hodnoty sloupce do jednoho řádku