PostgreSQL相当于MySQL GROUP BY

jer*_*use 6 mysql sql postgresql group-by aggregate-functions

我需要在表格中找到重复项.在MySQL中我只写:

SELECT *,count(id) count FROM `MY_TABLE`
GROUP BY SOME_COLUMN ORDER BY count DESC
Run Code Online (Sandbox Code Playgroud)

这个查询很好:

  • 根据SOME_COLUMN查找重复项,并重复计算.
  • 以重复的顺序排序,这对于快速扫描主要副本很有用.
  • 为所有剩余列选择一个随机值,让我了解这些列中的值.

Postgres中的类似查询向我发出错误:

列"MY_TABLE.SOME_COLUMN"必须出现在GROUP BY子句中或用于聚合函数

什么是Postgres相当于这个查询?

PS:我知道MySQL的行为偏离了SQL标准.

Erw*_*ter 12

反向标记是一种非标准的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;
Run Code Online (Sandbox Code Playgroud)

它需要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;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为DISTINCT ON(PostgreSQL特定的),如DISTINCT(SQL-Standard),在窗口函数之后应用count(*) OVER (...).窗口函数(带有OVER子句)需要PostgreSQL 8.4或更高版本,并且在MySQL中不可用.

适用于任何表,无论主要或唯一约束.

1DISTINCT ONORDER BY就是简写来指代在该项目的序号SELECT清单.

SQL小提琴并排展示.

这个密切相关答案的更多细节:


count(*)count(id)

如果您正在寻找重复,你最好用count(*)count(id).如果id可以NULL,则存在细微差别,因为NULL值不计算 - 同时count(*)计算所有行.如果id定义了NOT NULL,结果是相同的,但count(*)通常更合适(也更快).