Mysql
 sql >> база данни >  >> RDS >> Mysql

PostgreSQL еквивалент за MySQL GROUP BY

Обратните отметки са нещо нестандартно за MySQL. Използвайте каноничните двойни кавички, за да цитирате идентификатори (възможно и в MySQL). Тоест, ако вашата таблица всъщност се казва "MY_TABLE" (всички главни букви). Ако сте го нарекли (по-разумно) my_table (всички малки букви), тогава можете да премахнете двойните кавички или да използвате малки букви.

Също така използвам ct вместо count като псевдоним, защото е лоша практика да се използват имена на функции като идентификатори.

Прост случай

Това ще работи с PostgreSQL 9.1 :

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

Изисква колона(и) с първичен ключ в GROUP BY клауза. Резултатите са идентични към MySQL заявка, но ct винаги ще бъде 1 (или 0, ако id IS NULL ) - безполезно за намиране на дубликати.

Групиране по колони, различни от първичен ключ

Ако искате да групирате по други колони, нещата стават по-сложни. Тази заявка имитира поведението на вашата MySQL заявка - и вие можете използвайте * .

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;

Това работи, защото DISTINCT ON (специфичен за PostgreSQL), като DISTINCT (SQL-Standard), се прилагат след функцията на прозореца count(*) OVER (...) . Прозоречни функцииOVER клауза) изискват PostgreSQL 8.4 или по-нова версия и не са налични в MySQL.

Работи с всяка таблица, независимо от първични или уникални ограничения.

1 в DISTINCT ON и ORDER BY е просто съкращаване за позоваване на поредния номер на елемента в SELECT списък.

SQL Fiddle за да демонстрирате и двете едно до друго.

Повече подробности в този тясно свързан отговор:

count(*) спрямо count(id)

Ако търсите дубликати, по-добре е с count(*) отколкото с count(id) . Има фина разлика, ако id може да бъде NULL , защото NULL стойностите не се отчитат - докато count(*) брои всички редове. Ако id е дефиниран NOT NULL , резултатите са същите, но count(*) като цяло е по-подходящо (и малко по-бързо).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на предишна папка с данни на MySQL при нова инсталация на MySQL

  2. BIGINT(8) ли е най-голямото цяло число, което MySQL може да съхранява?

  3. Обединяване на две подобни таблици в MySQL

  4. Изберете топ 10 записа за всяка категория в MySQL

  5. MySQL - извличане на стойност от друга таблица, ако колоната е нула