我仍在学习Oracle SQL,希望您能提供指导。
假设我们有MONTHLY_SALES_TOTALS表,它有三个字段:name、region、amount。我们需要确定每个地区最好的销售人员。最好的意思是,它们的数量等于该地区的最大数量。
CREATE TABLE montly_sales_totals
(
name varchar(20),
amount numeric(9),
region varchar(30)
);
INSERT ALL
INTO montly_sales_totals (name, amount, region) VALUES ('Peter', 55555, 'east')
INTO montly_sales_totals (name, amount, region) VALUES ('Susan', 55555, 'east')
INTO montly_sales_totals (name, amount, region) VALUES ('Mark', 1000000, 'south')
INTO montly_sales_totals (name, amount, region) VALUES ('Glenn', 50000, 'east')
INTO montly_sales_totals (name, amount, region) VALUES ('Paul', 500000, 'south')
SELECT * from dual;可能的解决办法:
SELECT m1.name, m1.region, m1.amount
FROM montly_sales_totals m1
JOIN
(SELECT MAX(amount) max_amount, region FROM montly_sales_totals GROUP BY region) m2
ON (m1.region = m2.region)
WHERE m1.amount = m2.max_amount
ORDER by 2,1;SQL:http://sqlfiddle.com/#!4/6a2d8/6
现在我的问题是:
发布于 2013-02-21 20:18:42
我会用军衔():
SELECT *
FROM (
SELECT name, amount, region,
RANK() OVER (PARTITION BY region ORDER BY amount DESC) rnk
FROM montly_sales_totals
) t
WHERE t.rnk = 1下面是修改后的SQL Fiddle版本
发布于 2013-02-21 20:40:13
有很多方法可以解决这个问题。这是另一个:
select S.region, S.name, V.regionmax
from sales as S
inner join
(
select region, max(amount) as regionmax
from sales group by region
) as V
on S.region = V.region and S.amount = regionmax在效率方面,最主要的因素是使用适当的指标。内联视图可以很好地执行。
发布于 2013-02-21 21:25:32
我喜欢CTE语法,但是使用这个网站所花费的时间是相同的2ms,所以我无法击败您的:)
with Maximums as (
SELECT region,
MAX(amount) max_amount
FROM montly_sales_totals GROUP BY region
)
SELECT m1.name, m1.region, m1.amount
FROM montly_sales_totals m1, Maximums
WHERE (m1.amount = Maximums.max_amount)
and (m1.region = Maximums.region)
ORDER by 2,1;https://stackoverflow.com/questions/15011395
复制相似问题