我如何从下表(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)
);
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;
您发布的代码可以完成工作并返回正确的结果。虽然,您两次访问
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>