PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Agreguj jedną kolumnę w zapytaniu z wieloma kolumnami

Proste zapytanie

To może być znacznie prostsze z PostgreSQL 9.1 lub nowszym . Jak wyjaśniono w tej ściśle powiązanej odpowiedzi:

  • PGError:ERROR:agregacje niedozwolone w klauzuli WHERE w zapytaniu AR obiektu i jego obiektów has_many

Wystarczy GROUP BY klucz podstawowy tabeli. Od:

foo1 to klucz podstawowy

.. możesz uprościć swój przykład do:

SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ')
FROM   tbl1
GROUP  BY 1
ORDER  BY foo7, foo8;  -- have to be spelled out, since not in select list!

Zapytanie z wieloma tabelami

Jednak ponieważ masz:

o wiele więcej pól i LEFT JOIN, ważne jest to, że wszystkie te pola mają relacje 1 do 1 lub 1 do 0, z wyjątkiem jednego pola, które ma wartość 1 do n, które chcę agregować

.. powinno być szybsze i prostsze najpierw agregowanie, dołączanie później :

SELECT t1.foo1, t1.foo2, ...
     , t2.bar1, t2.bar2, ...
     , a.aggregated_col 
FROM   tbl1 t1
LEFT   JOIN tbl2 t2 ON ...
...
LEFT   JOIN (
   SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col
   FROM   agg_tbl a ON ...
   GROUP  BY some_id
   ) a ON a.some_id = ?.some_id
ORDER  BY ...

W ten sposób duża część zapytania w ogóle nie wymaga agregacji.

Niedawno przedstawiłem przypadek testowy w SQL Fiddle, aby udowodnić słuszność tej powiązanej odpowiedzi:

  • PostgreSQL — uporządkowanie według tablicy

Ponieważ odnosisz się do tej powiązanej odpowiedzi:Nie, DISTINCT w tym przypadku nie pomoże.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dziwny komunikat o błędzie SQLAlchemy:TypeError:obiekt „dict” nie obsługuje indeksowania

  2. UUID czy SEQUENCE dla klucza podstawowego?

  3. Opcjonalna instrukcja INSERT w łańcuchu transakcji przy użyciu NodeJS i Postgres

  4. Replikacja strumieniowa PostgreSQL a replikacja logiczna

  5. PostgreSQL:Dlaczego psql nie może połączyć się z serwerem?