如何从下表(Oracle SQL)中找到每个职业中薪水最高的员工

问题描述 投票:0回答:2

我如何从下表(Oracle SQL)中找到每个职业中薪水最高的员工。这是我的下表。任何帮助将不胜感激。

CREATE TABLE STAFF (
    Staff_ID NUMBER(5),
    First_Name VARCHAR2(25),
    Last_Name VARCHAR2(25),
    Date_Of_Birth DATE,
    Gender VARCHAR2(25),
    Email VARCHAR2(25),
    Telephone NUMBER(15),
    Department VARCHAR2(25),
    Staff_Type VARCHAR2(25),
    Visa_Restrictions VARCHAR2(40),
    Occupation VARCHAR2(25),
    Hire_Date DATE,
    Salary NUMBER (10),
    CONSTRAINT PK_STAFF PRIMARY KEY (Staff_ID)
 );
sql oracle-apex oracle-apex-5.1
2个回答
0
投票
SELECT s1.Occupation, s1.First_Name, s1.Last_Name, s1.Salary
FROM STAFF s1
WHERE s1.Salary = (
    SELECT MAX(s2.Salary)
    FROM STAFF s2
    WHERE s2.Occupation = s1.Occupation
)
ORDER BY s1.Occupation ASC;

0
投票

您发布的代码可以完成工作并返回正确的结果。虽然,您两次访问

staff
表,所以 - 性能方面 - 我想它可以改进。这是一个选项:使用
rank
分析函数,按薪水对每个职业的行进行降序排列,然后检索排名最高的行。由于此查询只访问表一次,因此如果您必须处理大量行,它应该会执行得更好。

示例数据:

SQL> select * from staff order by occupation, salary desc;

ENAME      OCCUPATIO     SALARY
---------- --------- ----------
FORD       ANALYST         3225
SCOTT      ANALYST         3225
MILLER     CLERK           1365
ADAMS      CLERK         1182.5
JAMES      CLERK           1045
SMITH      CLERK            860
JONES      MANAGER      3198.13
BLAKE      MANAGER         3135
CLARK      MANAGER       2572.5
KING       PRESIDENT       5250
ALLEN      SALESMAN        1760
TURNER     SALESMAN        1650
MARTIN     SALESMAN        1375
WARD       SALESMAN        1375

14 rows selected.

查询:

SQL> with temp as
  2    (select s.*,
  3       rank() over (partition by s.occupation order by s.salary desc) rnk
  4     from staff s
  5    )
  6  select t.ename, t.occupation, t.salary
  7  from temp t
  8  where t.rnk = 1
  9  order by t.occupation;

ENAME      OCCUPATIO     SALARY
---------- --------- ----------
SCOTT      ANALYST         3225
FORD       ANALYST         3225
MILLER     CLERK           1365
JONES      MANAGER      3198.13
KING       PRESIDENT       5250
ALLEN      SALESMAN        1760

6 rows selected.

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.