PostgreSQL equivalent for MySQL GROUP BY
我需要在表中查找重复项。 在MySQL中,我只需编写:
这个查询很好:
- 根据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中也可能)。也就是说,如果您的表实际上被命名为
另外,我使用
简单的情况
这将适用于PostgreSQL 9.1:
它要求
按主键列以外的分组
如果要按其他列分组,事情会变得更加复杂。该查询模仿了MySQL查询的行为-您可以使用
1 2 3 4 5 |
之所以可行,是因为在窗口函数
无论主要约束还是唯一约束,都可以与任何表一起使用。
SQL Fiddle并列演示。
在此密切相关的答案中有更多详细信息:
- 在每个GROUP BY组中选择第一行?
如果要查找重复项,使用
这是另一种使用DISTINCT ON的方法:
1 2 3 4 5 6 7 8 9 |
数据源:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
输出:
1 2 3 4 5 6 | SOME_COLUMN ID COL1 CT 5 10 1 3 2 4 1 2 3 6 4 2 4 8 3 2 1 3 4 1 |
实时测试:http://www.sqlfiddle.com/#!1 / e2509 / 1
DISTINCT ON文档:http://www.postgresonline.com/journal/archives/4-Using-Distinct-ON-to-return-newest-order-for-each-customer.html
这是一个自联的CTE,可让您使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | WITH zcte AS ( SELECT DISTINCT tt.key0 , MIN(tt.key1) AS key1 , MIN(tt.key2) AS key2 , COUNT(*) AS cnt FROM ztable tt GROUP BY tt.key0 HAVING COUNT(*) > 1 ) SELECT zt.* , zc.cnt AS cnt FROM ztable zt JOIN zcte zc ON zc.key0 = zt.key0 AND zc.key1 = zt.key1 AND zc.key2 = zt.key2 ORDER BY zt.key0, zt.key1,zt.key2 ; |
顺便说一句:为获得OP的预期行为,应省略
mysql允许
另一方面,postgres符合SQL标准。
在postgres中没有等效的查询。