Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Odpowiednik PostgreSQL dla MySQL GROUP BY

Tylne kleszcze to niestandardowa rzecz MySQL. Użyj kanonicznych podwójnych cudzysłowów do cytowania identyfikatorów (możliwe również w MySQL). To znaczy, jeśli w rzeczywistości Twoja tabela nosi nazwę "MY_TABLE" (wszystkie wielkie litery). Jeśli (bardziej mądrze) nazwałeś go my_table (wszystkie małe litery), możesz usunąć podwójne cudzysłowy lub użyć małych liter.

Ponadto używam ct zamiast count jako alias, ponieważ używanie nazw funkcji jako identyfikatorów jest złą praktyką.

Prosty przypadek

To działałoby z PostgreSQL 9.1 :

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

Wymaga kolumn klucza podstawowego w GROUP BY klauzula. Wyniki są identyczne do zapytania MySQL, ale ct zawsze będzie wynosić 1 (lub 0, jeśli id IS NULL ) - bezużyteczne, aby znaleźć duplikaty.

Grupuj według kolumn innych niż klucz podstawowy

Jeśli chcesz pogrupować według innych kolumn, sprawy się komplikują. To zapytanie naśladuje zachowanie zapytania MySQL – i możesz użyj * .

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;

Działa to, ponieważ DISTINCT ON (specyficzne dla PostgreSQL), jak DISTINCT (SQL-Standard), są stosowane po funkcja okna count(*) OVER (...) . Funkcje okien (z OVER klauzula) wymagają PostgreSQL 8.4 lub nowsze i nie są dostępne w MySQL.

Działa z każdą tabelą, niezależnie od podstawowych lub unikalnych ograniczeń.

1 w DISTINCT ON i ORDER BY jest po prostu skrótem odnoszącym się do numeru porządkowego elementu w SELECT lista.

Skrzypce SQL aby zademonstrować obie strony obok siebie.

Więcej szczegółów w tej ściśle powiązanej odpowiedzi:

count(*) a count(id)

Jeśli szukasz duplikatów, lepiej skorzystaj z count(*) niż z count(id) . Istnieje subtelna różnica, jeśli id może być NULL , ponieważ NULL wartości nie są liczone - podczas gdy count(*) liczy wszystkie wiersze. Jeśli id jest zdefiniowany NOT NULL , wyniki są takie same, ale count(*) jest ogólnie bardziej odpowiedni (i nieco szybszy).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. użyj wartości kolumny jako nazwy kolumny mysql

  2. Wtyczka uwierzytelniania 'caching_sha2_password' nie jest obsługiwana

  3. MySQL zmienia typ uwierzytelniania ze standardowego na caching_sha2_password

  4. Jak działa samodołączanie MYSQL?

  5. konwertuj znaczniki czasu epoki Unix na znaczniki czasu JavaScript