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

Agregovat jeden sloupec v dotazu s mnoha sloupci

Jednoduchý dotaz

To může být mnohem jednodušší s PostgreSQL 9.1 nebo novější . Jak je vysvětleno v této úzce související odpovědi:

  • PGError:ERROR:agregace nejsou povoleny v klauzuli WHERE v dotazu AR na objekt a jeho has_many objektů

Stačí GROUP BY primární klíč stolu. Od:

foo1 je primární klíč

.. svůj příklad můžete zjednodušit na:

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!

Dotaz s více tabulkami

Nicméně, protože máte:

mnohem více polí a LEFT JOINů, důležitá část je, že všechna tato pole mají vztah 1 ku 1 nebo 1 ku 0 kromě jednoho pole, které je 1 až n, které chci agregovat

.. mělo by být rychlejší a jednodušší nejprve agregovat, později se připojit :

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 ...

Tímto způsobem velká část vašeho dotazu vůbec nepotřebuje agregaci.

Nedávno jsem poskytl testovací případ v SQL Fiddle, abych dokázal bod v této související odpovědi:

  • PostgreSQL – řazení podle pole

Protože odkazujete na tuto související odpověď:Ne, DISTINCT v tomto případě vůbec nepomůže.



  1. Jak převést milisekundy na datum v SQLite

  2. Knihovna není načtena:/usr/local/opt/readline/lib/libreadline.6.2.dylib

  3. Přejmenování sloupce v SQL Server (T-SQL)

  4. Vytvoření vysoce dostupné databáze pro Moodle pomocí PostgreSQL