SQL - 计数 WHERE AGGREGATE>1 [重复]

Posted

技术标签:

【中文标题】SQL - 计数 WHERE AGGREGATE>1 [重复]【英文标题】:SQL - counting WHERE AGGREGATE>1 [duplicate] 【发布时间】:2009-09-02 17:05:05 【问题描述】:

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

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

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

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

如何计算多次出现的名字的数量?在伪 sql 中会是这样的:

select
    COUNT(
        firstname,
        count(*) as num_occurrences
    )
from 
    Customers 
group by 2 
having num_occurrences > 1;

【问题讨论】:

【参考方案1】:

你的想法是对的:

SELECT COUNT(*)
FROM (
  SELECT firstname
  FROM Customers
  GROUP BY firstname
  HAVING COUNT(*) >= 2
)

子查询计算多次出现的名字。然后你计算所有这些名字。 HAVING 子句允许您按聚合过滤。这就像一个WHERE 子句,除了你可以使用聚合函数。

【讨论】:

这太复杂了——IniTech 的答案更好。 我更喜欢这个解决方案的想法,因为数据库只返回我感兴趣的内容。不幸的是,这在 Informix 中似乎不起作用。 :( 那么您不要在 SELECT 子句中包含该列。如果可能,应避免子选择和子查询。 这将在 IDS 11.50 中工作;它可能在 IDS 11.10 中工作;它在 IDS 的早期版本中不起作用 - 最近添加了对“FROM 子句中的子查询”的支持。 @rexem:@IniTech 的回答没有回答问题。【参考方案2】:

不需要子查询。

试试:

SELECT firstname, COUNT(*)
  FROM Customers
 GROUP BY firstname
HAVING COUNT(*) > 1
 ORDER BY firstname

或者,按最有代表性的名字排序:

SELECT firstname, COUNT(*) AS custcount
  FROM Customers
 GROUP BY firstname
HAVING COUNT(*) > 1
 ORDER BY custcount DESC;

【讨论】:

应该引用username,而不是firstname。它也没有提供请求的答案 - 超过一行的用户名的数量。如果从临时表中的 INTO TEMP 后跟 SELECT 不算作子查询,您可以这样做 - 但否则... @Jonathon:如果不显示计数适用的用户名,输出将毫无意义。 @rexem:该问题询问在表中具有多个具有相同用户名的条目的客户数量。它本身并不要求提供用户名;它询问此类用户名的数量。这是一个经典的聚合查询,子查询在 FROM 子句是最好的回答方式。 @IniTech:再看问题,好像username和firstname有点混淆。示例查询选择了名字,但假定的查询结果列出了用户名。【参考方案3】:

这样就可以了:

select count(username)
  from (select username
          from Customers
         group by username
        having count(*) > 1);

【讨论】:

注意:问题对用户名和名字感到困惑 - 这个答案使用了“用户名”,而修改后的问题与“名字”一起使用。

以上是关于SQL - 计数 WHERE AGGREGATE>1 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL EXISTS vs. Aggregate IS NOT NULL

SQL:计数超过平均 HAVING 与 WHERE

如何在 python/pandas 中使用 where 条件转换 sql 计数?

SQL函数

SQL 函数

在STRING_SPLIT中使用Where IN并在SQL Server 2016中使用汇总计数