sql >> Database teknologi >  >> RDS >> Mysql

PostgreSQL-ækvivalent for MySQL GROUP BY

Back-ticks er en ikke-standard MySQL-ting. Brug de kanoniske dobbelte anførselstegn til at citere identifikatorer (også muligt i MySQL). Det vil sige, hvis din tabel faktisk hedder "MY_TABLE" (alle med store bogstaver). Hvis du (mere klogt) kaldte den my_table (alle små bogstaver), så kan du fjerne de dobbelte anførselstegn eller bruge små bogstaver.

Jeg bruger også ct i stedet for count som alias, fordi det er dårlig praksis at bruge funktionsnavne som identifikatorer.

Simpelt tilfælde

Dette ville fungere med PostgreSQL 9.1 :

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

Det kræver primærnøglekolonne(r) i GROUP BY klausul. Resultaterne er identiske til en MySQL-forespørgsel, men ct vil altid være 1 (eller 0 hvis id IS NULL ) - ubrugelig at finde dubletter.

Grupper efter andre kolonner end primære nøglekolonner

Hvis du vil gruppere efter andre kolonne(r), bliver tingene mere komplicerede. Denne forespørgsel efterligner adfærden af ​​din MySQL-forespørgsel - og du kan brug * .

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;

Dette virker, fordi DISTINCT ON (PostgreSQL-specifik), såsom DISTINCT (SQL-Standard), anvendes efter vinduesfunktionen count(*) OVER (...) . Vinduefunktioner (med OVER klausul) kræver PostgreSQL 8.4 eller nyere og er ikke tilgængelige i MySQL.

Fungerer med enhver tabel, uanset primære eller unikke begrænsninger.

1 i DISTINCT ON og ORDER BY er blot en forkortelse for at henvise til ordensnummeret på elementet i SELECT liste.

SQL Fiddle at demonstrere begge side om side.

Flere detaljer i dette nært beslægtede svar:

count(*) vs. count(id)

Hvis du leder efter dubletter, er du bedre stillet med count(*) end med count(id) . Der er en subtil forskel, hvis id kan være NULL , fordi NULL værdier tælles ikke - mens count(*) tæller alle rækker. Hvis id er defineret NOT NULL , resultaterne er de samme, men count(*) er generelt mere passende (og også lidt hurtigere).



  1. rs.last() giver ugyldig operation for kun at videresende resultatersæt:sidste

  2. Hvordan opdeles en enkelt kolonneværdier til flere kolonneværdier?

  3. Sådan fjerner du en database-mailkonto fra en profil i SQL Server (T-SQL)

  4. At spise vores eget hundefoder – Kører JIRA på MariaDB