I back-tick sono una cosa MySQL non standard. Usa le virgolette canoniche per citare gli identificatori (possibile anche in MySQL). Cioè, se la tua tabella in effetti si chiama "MY_TABLE"
(tutto maiuscolo). Se (più saggiamente) l'hai chiamato my_table
(tutto minuscolo), quindi puoi rimuovere le virgolette doppie o utilizzare le lettere minuscole.
Inoltre, uso ct
invece di count
come alias, perché è una cattiva pratica usare nomi di funzione come identificatori.
Caso semplice
Funzionerebbe con PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Richiede la/e colonna/e della chiave primaria in GROUP BY
clausola. I risultati sono identici a una query MySQL, ma ct
sarebbe sempre 1 (o 0 se id IS NULL
) - inutile trovare duplicati.
Raggruppa per colonne chiave diverse da quelle primarie
Se vuoi raggruppare per altre colonne, le cose si complicano. Questa query imita il comportamento della tua query MySQL e tu puoi usa *
.
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;
Funziona perché DISTINCT ON
(Specifico per PostgreSQL), come DISTINCT
(SQL-Standard), vengono applicati dopo la funzione della finestra count(*) OVER (...)
. Funzioni della finestra
(con il OVER
clausola) richiedono PostgreSQL 8.4 o versioni successive e non sono disponibili in MySQL.
Funziona con qualsiasi tabella, indipendentemente dai vincoli primari o univoci.
Il 1
in DISTINCT ON
e ORDER BY
è solo un'abbreviazione per fare riferimento al numero ordinale dell'elemento in SELECT
elenco.
SQL Fiddle per dimostrare entrambi fianco a fianco.
Maggiori dettagli in questa risposta strettamente correlata:
count(*)
rispetto a count(id)
Se stai cercando duplicati, è meglio con count(*)
rispetto a count(id)
. C'è una sottile differenza se id
può essere NULL
, perché NULL
i valori non vengono conteggiati - mentre count(*)
conta tutte le righe. Se id
è definito NOT NULL
, i risultati sono gli stessi, ma count(*)
è generalmente più appropriato (e anche leggermente più veloce).