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的主要内容,如果未能解决你的问题,请参考以下文章