sql >> Databáze >  >> RDS >> Mysql

PostgreSQL ekvivalent pro MySQL GROUP BY

Back-ticks jsou nestandardní MySQL věc. K uvozovkám identifikátorů použijte kanonické dvojité uvozovky (možné i v MySQL). To znamená, že pokud se vaše tabulka ve skutečnosti jmenuje "MY_TABLE" (všechna velká písmena). Pokud jste to (moudřeji) pojmenovali my_table (všechna malá písmena), pak můžete odstranit dvojité uvozovky nebo použít malá písmena.

Také používám ct místo count jako alias, protože je špatné používat názvy funkcí jako identifikátory.

Jednoduchý případ

To by fungovalo s PostgreSQL 9.1 :

SELECT *, count(id) ct
FROM   my_table
GROUP  BY primary_key_column(s)
ORDER  BY ct DESC;

Vyžaduje to sloupce primárního klíče v GROUP BY doložka. Výsledky jsou identické na dotaz MySQL, ale ct bude vždy 1 (nebo 0, pokud id IS NULL ) - zbytečné hledat duplikáty.

Seskupit podle sloupců jiného než primárního klíče

Pokud chcete seskupit podle jiných sloupců, věci se zkomplikují. Tento dotaz napodobuje chování vašeho dotazu MySQL – a vy to můžete použijte * .

SELECT DISTINCT ON (1, some_column)
       count(*) OVER (PARTITION BY some_column) AS ct
      ,*
FROM   my_table
ORDER  BY 1 DESC, some_column, id, col1;

Funguje to, protože DISTINCT ON (specifické pro PostgreSQL), například DISTINCT (SQL-Standard), jsou aplikovány po funkce okna count(*) OVER (...) . Funkce okna (se znakem OVER klauzule) vyžadují PostgreSQL 8.4 nebo novější a nejsou dostupné v MySQL.

Funguje s jakoukoli tabulkou bez ohledu na primární nebo jedinečná omezení.

1 v DISTINCT ON a ORDER BY je jen zkratka odkazující na pořadové číslo položky v SELECT seznam.

SQL Fiddle demonstrovat obě vedle sebe.

Více podrobností v této úzce související odpovědi:

count(*) vs. count(id)

Pokud hledáte duplikáty, je lepší použít count(*) než pomocí count(id) . Pokud id, existuje nepatrný rozdíl může být NULL , protože NULL hodnoty se nepočítají – zatímco count(*) počítá všechny řádky. Pokud id je definováno NOT NULL , výsledky jsou stejné, ale count(*) je obecně vhodnější (a také o něco rychlejší).



  1. Jak zkopírovat databázi SQLite z Androidu do databáze MySQL (replikovat/synchronizovat)

  2. Jaké jsou rozdíly mezi transformacemi Merge Join a Lookup v SSIS?

  3. SQL Stále dostává chybu s ON UPDATE CASCADE

  4. Co je to přesně BLOB v kontextu DBMS