SQL - 在哪里聚合>1

Posted

技术标签:

【中文标题】SQL - 在哪里聚合>1【英文标题】:SQL - WHERE AGGREGATE>1 【发布时间】:2009-07-31 14:56:46 【问题描述】:

假设我有一个客户数据库表,其中包含 id,username,firstname,lastname

如果我想知道有多少个不同名字的实例,我可以这样做:

select firstname,count(*) from Customers group by 2 order by 1;

   username | count(*)
   ===================
   bob      |   1
   jeff     |   2
   adam     |   5

如何编写相同的查询以仅返回多次出现的名字?即在上面的例子中只返回 jeff 和 adam 的行。

【问题讨论】:

记住组级别的 HAVING 过滤器,请参阅:***.com/questions/1130062/… 【参考方案1】:

你想要having 子句,像这样:

select 
    firstname,
    count(*) 
from Customers 
group by firstname
having count(*) > 1
order by 1

【讨论】:

【参考方案2】:

group by 2 order by 1 很糟糕,我应该说。如果支持,请使用正确的列名:这将大大提高可读性。

考虑到这一点,

select firstname, count(*) c 
from Customers 
group by firstname  
having count(*) > 1 -- Kudos to Shannon
order by c;

【讨论】:

我不了解 Informix,但通常 select 子句中的列别名在 having 子句中不可用,因为之前已经评估了 having。 @Shannon:SQL 的不一致总是让我感到惊讶。谢谢! +1 表示“按 2 分组,按 1 排序太糟糕了”。但是,它也应该是一个错误;至少,服务器应该说“必须按名字分组(选择列表中的非聚合)”。【参考方案3】:

这就是 HAVING 子句的作用。我不确定这是否适用于informix,但试一试:

select firstname, count(*) 
from Customers 
group by firstname
HAVING COUNT(*) > 1

【讨论】:

以上是关于SQL - 在哪里聚合>1的主要内容,如果未能解决你的问题,请参考以下文章

postgresql 聚合函数存储在哪里?

带有聚合组件的 sql union

Sql Server 聚合或数据透视表查询

在 Mozilla 砖块和谷歌的聚合物等网络组件计划的背景下,角度在哪里适合? [关闭]

mysqldump 文件在哪里?

我们可以在哪里使用列表初始化?