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