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