SQL:计数超过平均 HAVING 与 WHERE

Posted

技术标签:

【中文标题】SQL:计数超过平均 HAVING 与 WHERE【英文标题】:SQL: Count more than average HAVING vs. WHERE 【发布时间】:2020-06-13 05:44:37 【问题描述】:

我有一个相当简单的面试问题:返回所有客户数量超过所有城市平均客户数量的国家/地区。

country表:

id country_name
1  Austria
2  Germany
3  United Kingdom

city表:

id city_name country_id
1  Wien      1
2  Berlin    2
3  Hamburg   2
4  London    3

customer表:

id customer_name city_id
1  cust1         1
2  cust2         4
3  cust3         3
4  cust4         1
5  cust5         2
6  cust6         1
7  cust7         4
8  cust8         2

以下是我的解决方案。我的答案很接近但没有通过测试用例,因为我返回的国家数量超过了预期的输出。你知道为什么,或者你会如何解决这个问题吗?

SELECT 
    co.country_name, COUNT(customer_name)
FROM
    country co
        JOIN
    city ci ON co.id = ci.country_id
        JOIN
    customer cu ON ci.id = cu.city_id
GROUP BY co.country_name
HAVING COUNT(customer_name) > (SELECT 
        AVG(temp.cnt)
    FROM
        (SELECT 
            ci.id, COUNT(customer_name) AS cnt
        FROM
            city ci
        JOIN customer cu ON ci.id = cu.city_id
        GROUP BY ci.id) temp)
ORDER BY co.country_name ASC;

此线程中的用户SQL: Count values higher than average for a group 正在使用WHERE 而不是HAVING 来选择大于平均值的值。不知HAVING是不是不适合这类问题。

【问题讨论】:

你的输出是什么?你能在这里发帖吗? 不幸的是,我没有在在线评估平台上完成的输出。输出应该类似于奥地利 3、德国 4 等 @AlvinH 。 . .你可能误解了这个问题。如果问题是:“返回所有客户数量超过所有国家/地区平均客户数量的国家/地区”会更有意义。您的查询看起来与您提出的问题相符。 【参考方案1】:

您当前的查询是解决此问题的一种有效方法,但您的答案的接收者可能期待不同的解决方案。一种更现代的方法可能涉及分析函数:

WITH cte AS (
    SELECT co.country_name, COUNT(customer_name) cnt,
           AVG(COUNT(customer_name)) OVER () avg_cnt
    FROM country co
    INNER JOIN city ci ON co.id = ci.country_id
    INNER JOIN customer cu ON ci.id = cu.city_id
    GROUP BY co.country_name
)

SELECT country_name, cnt
FROM cte
WHERE cnt > avg_cnt;

在上面的 CTE 中,当我们计算出每个国家/地区名称的计数时,我们还会计算整个原始结果集的平均计数。然后,我们所要做的就是子查询并将每个计数与平均值进行比较。

【讨论】:

这不会返回城市级别的平均值,这正是问题所要求的。赞成票没有意义。此外,问题在于 结果集,而不是查询的样式。 。 .你会很惊讶的。【参考方案2】:

逻辑相同,获取查询不同。

编写一个查询,它将按升序返回所有城市名称、国家名称和客户数量超过所有城市平均客户数量的客户数量。

SELECT city.city_name, country.country_name, COUNT(customer.id) AS 
num_customer
FROM city
JOIN country ON city.country_id = country.id
JOIN customer ON city.id = customer.city_id
GROUP BY city.id
HAVING num_customer > (SELECT AVG(num_customer) FROM (SELECT city.id, 
COUNT(customer.id) AS num_customer
FROM city
JOIN country ON city.country_id = country.id
JOIN customer ON city.id = customer.city_id
GROUP BY city.id) AS temp)
ORDER BY country.country_name;

【讨论】:

以上是关于SQL:计数超过平均 HAVING 与 WHERE的主要内容,如果未能解决你的问题,请参考以下文章

SQL中where与having的区别

SQL中where与having的区别

SQL中Where与Having的区别

SQL中Where与Having的区别

数据库中having 和where有啥区别

sql语句有关where,group by,having的问题