sql:比平均数更多的有vs.where

axkjgtzd  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(333)

我有一个相当直截了当的面试问题:返回所有客户数量超过所有城市平均客户数量的国家。 country 表格:

  1. id country_name
  2. 1 Austria
  3. 2 Germany
  4. 3 United Kingdom
  5. ``` `city` 表格:

id city_name country_id
1 Wien 1
2 Berlin 2
3 Hamburg 2
4 London 3
``` customer 表格:

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

下面是我的解决方案。我的答案很接近,但没有通过测试,因为我的国家比预期的产量还多。你知道为什么,或者你将如何处理这个问题吗?

  1. SELECT
  2. co.country_name, COUNT(customer_name)
  3. FROM
  4. country co
  5. JOIN
  6. city ci ON co.id = ci.country_id
  7. JOIN
  8. customer cu ON ci.id = cu.city_id
  9. GROUP BY co.country_name
  10. HAVING COUNT(customer_name) > (SELECT
  11. AVG(temp.cnt)
  12. FROM
  13. (SELECT
  14. ci.id, COUNT(customer_name) AS cnt
  15. FROM
  16. city ci
  17. JOIN customer cu ON ci.id = cu.city_id
  18. GROUP BY ci.id) temp)
  19. ORDER BY co.country_name ASC;

此线程sql中的用户:高于组平均值的计数值正在使用 WHERE 而不是 HAVING 选择大于平均值的值。我想知道 HAVING 不适用于此类问题。

20jt8wwn

20jt8wwn1#

您当前的查询是解决此问题的一种有效方法,但您的答案的接收者可能希望得到不同的解决方案。更现代的方法可能包括分析函数:

  1. WITH cte AS (
  2. SELECT co.country_name, COUNT(customer_name) cnt,
  3. AVG(COUNT(customer_name)) OVER () avg_cnt
  4. FROM country co
  5. INNER JOIN city ci ON co.id = ci.country_id
  6. INNER JOIN customer cu ON ci.id = cu.city_id
  7. GROUP BY co.country_name
  8. )
  9. SELECT country_name, cnt
  10. FROM cte
  11. WHERE cnt > avg_cnt;

在上面的cte中,当我们计算出每个国家名称的计数时,我们还计算整个原始结果集的平均计数。然后,我们只需子查询并将每个计数与平均值进行比较。

相关问题