PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Създайте масив в SELECT

Това трябва да свърши работа:

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;

Връща:

  • ct_total :общ брой на b за a .
  • ct_distinct_b :брой отделни b за a .
  • b_arr :масив от b плюс честотата на b , сортирани по честота на b .

Подредени по общ брой на b за a .

Като алтернатива можете да използвате ORDER BY клауза в рамките на сборното извикване в PostgreSQL 9.0 или по-нова версия. Като:

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;

Може и по-ясно. Но обикновено е по-бавно. И сортирането на редове в подзаявка работи за прости заявки като тази. Повече обяснение:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите името на документ в Alfresco с SQL?

  2. Как да направите заявка без значение за главни букви в Postgresql?

  3. Как работи LocalTimeStamp() в PostgreSQL

  4. Мога ли да използвам функциите на Postgres, за да намеря точки във въртящ се правоъгълник с фиксиран размер?

  5. Ограничение за външен ключ с някои стойности на колони, намиращи се в други таблици