首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询以确定“表现最好者”[?]

SQL查询以确定“表现最好者”[?]
EN

Stack Overflow用户
提问于 2013-02-21 20:16:26
回答 4查看 707关注 0票数 4

我仍在学习Oracle SQL,希望您能提供指导。

假设我们有MONTHLY_SALES_TOTALS表,它有三个字段:nameregionamount。我们需要确定每个地区最好的销售人员。最好的意思是,它们的数量等于该地区的最大数量。

代码语言:javascript
复制
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;

可能的解决办法:

代码语言:javascript
复制
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

现在我的问题是:

  1. 这种查询的效率有多高?
  2. 如何简化和/或改进?
  3. 我无法使用顶级,因为“最大”行的数量因区域而异。这是我可以用的另一个直接功能吗?
EN

回答 4

Stack Overflow用户

发布于 2013-02-21 20:18:42

我会用军衔():

代码语言:javascript
复制
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版本

票数 5
EN

Stack Overflow用户

发布于 2013-02-21 20:40:13

有很多方法可以解决这个问题。这是另一个:

代码语言:javascript
复制
       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

在效率方面,最主要的因素是使用适当的指标。内联视图可以很好地执行。

票数 1
EN

Stack Overflow用户

发布于 2013-02-21 21:25:32

我喜欢CTE语法,但是使用这个网站所花费的时间是相同的2ms,所以我无法击败您的:)

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15011395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档