sql >> Database >  >> RDS >> Mysql

PostgreSQL-equivalent voor MySQL GROUP BY

Back-ticks zijn een niet-standaard MySQL-ding. Gebruik de canonieke dubbele aanhalingstekens om identifiers aan te halen (ook mogelijk in MySQL). Dat wil zeggen, als uw tabel in feite de naam "MY_TABLE" heeft (allemaal hoofdletters). Als je het (verstandiger) noemde my_table (allemaal kleine letters), dan kunt u de dubbele aanhalingstekens verwijderen of kleine letters gebruiken.

Ik gebruik ook ct in plaats van count als alias, omdat het een slechte gewoonte is om functienamen als identifiers te gebruiken.

Eenvoudig geval

Dit zou werken met PostgreSQL 9.1 :

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

Het vereist primaire sleutelkolom(men) in de GROUP BY clausule. De resultaten zijn identiek naar een MySQL-query, maar ct zou altijd 1 zijn (of 0 als id IS NULL ) - nutteloos om duplicaten te vinden.

Groepeer op andere dan primaire sleutelkolommen

Als u op andere kolom(men) wilt groeperen, wordt het ingewikkelder. Deze query bootst het gedrag van uw MySQL-query na - en u kunt gebruik * .

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;

Dit werkt omdat DISTINCT ON (PostgreSQL-specifiek), zoals DISTINCT (SQL-standaard), worden na . toegepast de vensterfunctie count(*) OVER (...) . Vensterfuncties (met de OVER clausule) vereisen PostgreSQL 8.4 of later en zijn niet beschikbaar in MySQL.

Werkt met elke tabel, ongeacht primaire of unieke beperkingen.

De 1 in DISTINCT ON en ORDER BY is slechts een afkorting om te verwijzen naar het volgnummer van het item in de SELECT lijst.

SQL Fiddle om beide naast elkaar te demonstreren.

Meer details in dit nauw verwante antwoord:

count(*) vs. count(id)

Als u op zoek bent naar duplicaten, bent u beter af met count(*) dan met count(id) . Er is een subtiel verschil als id kan NULL zijn , omdat NULL waarden worden niet geteld - terwijl count(*) telt alle rijen. Als id is gedefinieerd NOT NULL , resultaten zijn hetzelfde, maar count(*) is over het algemeen geschikter (en ook iets sneller).



  1. 2 manieren om een ​​substring in MariaDB te vervangen

  2. Quickbooks ODBC-stuurprogramma

  3. Waar zijn mijn patches?

  4. SQLAlchemy, Psycopg2 en Postgresql KOPIE