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