【问题标题】:I just need to get the highest paid employee per city我只需要找到每个城市收入最高的员工
【发布时间】:2018-12-15 06:04:55
【问题描述】:

我正在尝试获得一个新视图,我可以在其中显示每家商店中薪酬最高的员工的一条记录。

输出(期望) 显示每个商店中薪酬最高的员工 STORE_ID - 1 没有员工,因此不在报告中

ENAME   JOB         STORE_ID    MAX(SAL)    CITY
ALLEN   SALESMAN    2           1600        New York City
KING    PRESIDENT   3           5000        Chicago
SCOTT   ANALYST     4           3000        Philadelphia

实际输出

ENAME   JOB STORE_ID    MAX(SAL)    CITY
ALLEN   SALESMAN    2   1600    New York City
TURNER  SALESMAN    2   1500    New York City
WARD    SALESMAN    2   1250    New York City
MARTIN  SALESMAN    2   1250    New York City
KING    PRESIDENT   3   5000    Chicago
BLAKE   MANAGER 3   2850    Chicago
CLARK   MANAGER 3   2450    Chicago
SCOTT   ANALYST 4   3000    Philadelphia
FORD    ANALYST 4   3000    Philadelphia
JONES   MANAGER 4   2975    Philadelphia
MILLER  CLERK   4   1300    Philadelphia
ADAMS   CLERK   4   1100    Philadelphia
JAMES   CLERK   4   950 Philadelphia
SMITH   CLERK   4   800 Philadelphia

我只能使用 SELECT、GROUP BY、HAVING、ORDER BY、INNER JOIN(或其他类型的 JOINS)。我不能使用分区,WITH

此查询确实生成了必要的行,但它包含其他所有行(除了最高收入的行)

商店的 DDL

CREATE TABLE  "STORES" 
   (    "STORE_ID" NUMBER NOT NULL ENABLE, 
    "CITY" VARCHAR2(50), 
     PRIMARY KEY ("STORE_ID")
  USING INDEX  ENABLE
   )
/

员工的 DDL

CREATE TABLE  "EMPLOYEES" 
   (    "EMPNO" NUMBER(4,0), 
    "ENAME" VARCHAR2(10), 
    "JOB" VARCHAR2(9), 
    "HIREDATE" DATE, 
    "SAL" NUMBER(7,2), 
    "COMM" NUMBER(7,2), 
    "STORE_ID" NUMBER
   )
/

CREATE INDEX  "EMP_NAME_IDEX" ON  "EMPLOYEES" ("ENAME")
/

CREATE INDEX  "EMP_NAME_JOB_DATE_IDX" ON  "EMPLOYEES" ("ENAME", "JOB", "HIREDATE")
/

第一个问题是关于糟糕的 SQL 语法。这个正在尝试找到每个商店中薪水最高的员工

【问题讨论】:

  • 分享你写的查询
  • “我正在尝试获得一个新视图,在该视图中可以显示每个商店中薪酬最高的员工的记录。”是上一个问题的摘录。
  • 您能分享产生该结果的查询吗?

标签: sql oracle oracle11g


【解决方案1】:

您可以使用rank 窗口函数按工资对每家商店的员工进行排名,然后只取前一位:

SELECT t.ename, t.job, t.sal, t.city
FROM   (SELECT e.ename, e.job, e.sal, s.city,
               RANK() OVER (PARTITION BY e.store_id ORDER BY s.sal DESC) AS rk
        FROM   employees e
        JOIN   stores s on e.store_id = s.store_id) t
WHERE  rk = 1

【讨论】:

    【解决方案2】:

    Oracle 对 group by 聚合函数有很好的扩展,可以提供帮助:

    select max(e.ename) keep (dense_rank first order by e.sal desc) as ename,
           max(e.job) keep (dense_rank first order by e.sal desc) as ejob,
           s.store_id,
           max(e.sal) as sal
           s.city
    from employee e join
         stores s
         on e.store_id = s.store_id
    group by s.store_id, s.city;
    

    【讨论】:

      【解决方案3】:

      尝试如下使用子查询

      select e.ENAME,t1.STORE_ID,t1.sal,s.CITY from (
       SELECT  MAX(e.SAL) sal,
       e.STORE_ID FROM EMPLOYEES e    
       GROUP BY e.STORE_ID
             ) t1 join EMPLOYEES e on t1.STORE_ID =e.STORE_ID  and e.sal=t1.sal
                  join STORES  s on t1.STORE_ID =s.STORE_ID 
      

      【讨论】:

        【解决方案4】:

        这个可以用:

        select * from (select e.ename,e.job,s.store_id,s.sal,s.city,
        rank() over (partition by s.store_id order by s.sal desc) rnk 
        from
        employee e ,stores s
        where e.store_id=s.store_id)
        where rnk=1;
        

        【讨论】:

        • 这与老师在答案键上的答案相同。你能解释一下吗?
        猜你喜欢
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        • 2018-08-24
        • 2011-08-04
        • 2020-06-06
        相关资源
        最近更新 更多