SELECT *,count(id) count FROM `MY_TABLE` GROUP BY SOME_COLUMN ORDER BY count DESC
这个查询很好:
>根据SOME_COLUMN查找重复项,并重复计算.
>按重复的顺序排序,这对于快速扫描主要副本很有用.
>为所有剩余列选择一个随机值,让我了解这些列中的值.
column “MY_TABLE.SOME_COLUMN” must appear in the GROUP BY clause or be
used in an aggregate function
什么是Postgres相当于这个查询?
另外,我使用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(*)通常更合适(并且也更快).