【问题标题】:Query simplification Oracle Northwind查询简化 Oracle Northwind
【发布时间】:2016-04-06 18:37:25
【问题描述】:
任务:
查找最多客户所属的国家/地区。
查询
SELECT country,
count(*)
FROM customers
GROUP BY country
HAVING count(*) =
(SELECT max(max_sal)
FROM
(SELECT count(*) max_sal
FROM customers
GROUP BY country)) ;
结果:
结果是正确的,但我认为编写查询的方法很困难
问题:有什么简单的方法可以重写这个查询。
【问题讨论】:
标签:
sql
database
oracle
northwind
【解决方案1】:
我可能遗漏了一些东西,但它可以像这样简单:
SELECT *
FROM ( SELECT country, COUNT (*) max_sal
FROM customers
GROUP BY country
ORDER BY COUNT (*) DESC)
WHERE ROWNUM <= 1;
【解决方案2】:
你可以使用WITH子句:
WITH
c AS (
SELECT country, Count(1) n
FROM customers
GROUP BY country)
SELECT country, n
FROM c
WHERE n = (SELECT Max(n) FROM c)
【解决方案3】:
你可以使用分析函数 over() 得到结果的每一行的最大值(平均值、最小值等)的结果,然后在哪里比较 count(1) 和 max(count(1))
这是一个例子:
SELECT country, cnt, max_cnt
FROM (SELECT country, COUNT(1) AS cnt, MAX(COUNT(1)) over() max_cnt
FROM customers
GROUP BY country)
WHERE cnt = max_cnt
【解决方案4】:
SELECT Country, MAX(N) FROM (
SELECT Country, COUNT(*) as N FROM CUSTOMERS GROUP BY Country
);