sql >> Databasteknik >  >> RDS >> Mysql

PostgreSQL-motsvarighet för MySQL GROUP BY

Back-ticks är en icke-standard MySQL-grej. Använd de kanoniska dubbla citattecken för att citera identifierare (möjligt även i MySQL). Det vill säga om din tabell faktiskt heter "MY_TABLE" (alla versaler). Om du (mer klokare) döpte den till my_table (alla gemener), då kan du ta bort de dubbla citattecken eller använda gemener.

Jag använder också ct istället för count som alias, eftersom det är dålig praxis att använda funktionsnamn som identifierare.

Enkelt fall

Detta skulle fungera med PostgreSQL 9.1 :

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

Den kräver primärnyckelkolumn(er) i GROUP BY klausul. Resultaten är identiska till en MySQL-fråga, men ct skulle alltid vara 1 (eller 0 om id IS NULL ) - onödigt att hitta dubbletter.

Gruppera efter andra kolumner än primärnyckelkolumner

Om du vill gruppera efter andra kolumner blir saker och ting mer komplicerade. Den här frågan efterliknar beteendet hos din MySQL-fråga - och du kan använd * .

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;

Detta fungerar eftersom DISTINCT ON (PostgreSQL-specifik), som DISTINCT (SQL-standard), tillämpas efter fönsterfunktionen count(*) OVER (...) . Fönsterfunktioner (med OVER klausul) kräver PostgreSQL 8.4 eller senare och är inte tillgängliga i MySQL.

Fungerar med alla tabeller, oavsett primära eller unika begränsningar.

1 i DISTINCT ON och ORDER BY är bara en förkortning för att referera till artikelns ordningsnummer i SELECT lista.

SQL Fiddle för att visa båda sida vid sida.

Mer information i detta närbesläktade svar:

count(*) kontra count(id)

Om du letar efter dubbletter är du bättre med count(*) än med count(id) . Det finns en subtil skillnad om id kan vara NULL , eftersom NULL värden räknas inte - medan count(*) räknar alla rader. Om id är definierad NOT NULL , resultaten är desamma, men count(*) är i allmänhet mer lämpligt (och lite snabbare också).



  1. SQL-fråga med flera värden i en cell

  2. Hur man pausar exekveringen av ett uttalande i PostgreSQL

  3. Beställ varcharsträng som numerisk

  4. Bästa sättet att installera hstore på flera scheman i en Postgres-databas?