用于识别 "Top Performers"[?] 的 SQL 查询

标签 sql oracle11g

我仍在学习 Oracle SQL,希望得到您的指导。

假设我们有 MONTHLY_SALES_TOTALS 表,它有 3 个字段: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 fiddle :http://sqlfiddle.com/#!4/6a2d8/6

现在我的问题:
  • 这种查询的效率如何?
  • 如何/应该如何简化和/或改进它?
  • 我无法使用 顶部 因为“最大”行数因地区而异。这是我可以使用的另一个直接功能吗?
  • 最佳答案

    我会使用 RANK():

    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 的修改版本

    关于用于识别 "Top Performers"[?] 的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15011395/

    相关文章:

    sql - 在 Oracle 11g XE 上更改 NLS 字符集参数

    python - 在 Windows 中部署 cx_Oracle

    php - 数据库选择和查询问题 - PHP

    sql - View 是否自动更新

    php - 无法执行更新功能。我认为我的 $id 赋值有问题

    mysql - rails : Find all records matching condition for any of the associated objects

    oracle - 数据仓库中的星型模式与雪花型模式?

    java - 如何使用 jooq API 获取数据库当前时间

    sql - Oracle select 查询出现内部 select 查询错误

    java - 如何估计运行促进在线交易的网络应用程序所需的互联网带宽?