加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL相当于MySQL GROUP BY

发布时间:2020-12-13 16:13:25 所属栏目:百科 来源:网络整理
导读:我需要在表格中找到重复项.在 MySQL中我只写: SELECT *,count(id) count FROM `MY_TABLE`GROUP BY SOME_COLUMN ORDER BY count DESC 这个查询很好: 根据SOME_COLUMN查找重复项,并重复计算. 按重复的顺序排序,这对于快速扫描主要副本很有用. 为所有剩余列选
我需要在表格中找到重复项.在 MySQL中我只写:
SELECT *,count(id) count FROM `MY_TABLE`
GROUP BY SOME_COLUMN ORDER BY count DESC

这个查询很好:

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

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

column “MY_TABLE.SOME_COLUMN” must appear in the GROUP BY clause or be
used in an aggregate function

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

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

反向标记是一种非标准的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(如果id为NULL,则为0) – 无法查找重复项.

按主键列以外的分组

如果你想按其他列分组,事情会变得更复杂.此查询模仿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(…)之后应用. Window functions(使用OVER子句)需要PostgreSQL 8.4或更高版本,并且在MySQL中不可用.

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

DISTINCT ON和ORDER BY中的1只是简写,用于引用SELECT列表中项目的序号.

SQL Fiddle并肩展示.

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

> Select first row in each GROUP BY group?

count(*)与count(id)

如果您正在寻找重复项,那么使用count(*)比使用count(id)更好.如果id可以为NULL,则存在细微差别,因为不计算NULL值 – 而count(*)计算所有行.如果id被定义为NOT NULL,则结果是相同的,但count(*)通常更合适(并且也更快).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读