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

huangapple go评论102阅读模式
英文:

How do I find the staff with the highest salary in every occupation from the table below (Oracle SQL)

问题

你想要找到每个职业中薪水最高的员工,可以使用以下Oracle SQL查询:

  1. SELECT Occupation, MAX(Salary) AS Max_Salary
  2. FROM STAFF
  3. GROUP BY Occupation;

这个查询将按职业分组,找到每个职业中的最高薪水。

英文:

How do I find the staff with the highest salary in every occupation from the table below (Oracle SQL). This is my table below. Any help will be appreciated.

  1. CREATE TABLE STAFF (
  2. Staff_ID NUMBER(5),
  3. First_Name VARCHAR2(25),
  4. Last_Name VARCHAR2(25),
  5. Date_Of_Birth DATE,
  6. Gender VARCHAR2(25),
  7. Email VARCHAR2(25),
  8. Telephone NUMBER(15),
  9. Department VARCHAR2(25),
  10. Staff_Type VARCHAR2(25),
  11. Visa_Restrictions VARCHAR2(40),
  12. Occupation VARCHAR2(25),
  13. Hire_Date DATE,
  14. Salary NUMBER (10),
  15. CONSTRAINT PK_STAFF PRIMARY KEY (Staff_ID)
  16. );

答案1

得分: 1

以下是翻译好的部分:

"你发布的代码完成了任务并返回了正确的结果。不过,你两次访问了 staff 表,所以从性能的角度来看,我认为可能可以改进。这里有一个选项:使用 rank 分析函数,在按工资降序排列的情况下为每个职业排名,然后检索排名最高的行。由于此查询只访问表一次,如果你需要处理大量行,它应该性能更好。

对于示例数据:

  1. SQL> select * from staff order by occupation, salary desc;
  2. ENAME OCCUPATIO SALARY
  3. ---------- --------- ----------
  4. FORD ANALYST 3225
  5. SCOTT ANALYST 3225
  6. MILLER CLERK 1365
  7. ADAMS CLERK 1182.5
  8. JAMES CLERK 1045
  9. SMITH CLERK 860
  10. JONES MANAGER 3198.13
  11. BLAKE MANAGER 3135
  12. CLARK MANAGER 2572.5
  13. KING PRESIDENT 5250
  14. ALLEN SALESMAN 1760
  15. TURNER SALESMAN 1650
  16. MARTIN SALESMAN 1375
  17. WARD SALESMAN 1375
  18. 14 rows selected.

查询:

  1. SQL> with temp as
  2. 2 (select s.*,
  3. 3 rank() over (partition by s.occupation order by s.salary desc) rnk
  4. 4 from staff s
  5. 5 )
  6. 6 select t.ename, t.occupation, t.salary
  7. 7 from temp t
  8. 8 where t.rnk = 1
  9. 9 order by t.occupation;
  10. ENAME OCCUPATIO SALARY
  11. ---------- --------- ----------
  12. SCOTT ANALYST 3225
  13. FORD ANALYST 3225
  14. MILLER CLERK 1365
  15. JONES MANAGER 3198.13
  16. KING PRESIDENT 5250
  17. ALLEN SALESMAN 1760
  18. 6 rows selected.
  19. SQL>";
英文:

Code you posted does the job and returns correct result. Though, you're accessing the staff table twice, so - performance wise - I guess it could be improved. Here's one option: use rank analytic function which ranks rows for each occupation by salary in descending order, and then retrieve rows that ranked as the highest. As this query accesses the table only once, it should perform better if you have to deal with a lot of rows.

For sample data:

  1. SQL> select * from staff order by occupation, salary desc;
  2. ENAME OCCUPATIO SALARY
  3. ---------- --------- ----------
  4. FORD ANALYST 3225
  5. SCOTT ANALYST 3225
  6. MILLER CLERK 1365
  7. ADAMS CLERK 1182.5
  8. JAMES CLERK 1045
  9. SMITH CLERK 860
  10. JONES MANAGER 3198.13
  11. BLAKE MANAGER 3135
  12. CLARK MANAGER 2572.5
  13. KING PRESIDENT 5250
  14. ALLEN SALESMAN 1760
  15. TURNER SALESMAN 1650
  16. MARTIN SALESMAN 1375
  17. WARD SALESMAN 1375
  18. 14 rows selected.

Query:

  1. SQL> with temp as
  2. 2 (select s.*,
  3. 3 rank() over (partition by s.occupation order by s.salary desc) rnk
  4. 4 from staff s
  5. 5 )
  6. 6 select t.ename, t.occupation, t.salary
  7. 7 from temp t
  8. 8 where t.rnk = 1
  9. 9 order by t.occupation;
  10. ENAME OCCUPATIO SALARY
  11. ---------- --------- ----------
  12. SCOTT ANALYST 3225
  13. FORD ANALYST 3225
  14. MILLER CLERK 1365
  15. JONES MANAGER 3198.13
  16. KING PRESIDENT 5250
  17. ALLEN SALESMAN 1760
  18. 6 rows selected.
  19. SQL>

答案2

得分: 0

Sure, here's the translated SQL query:

  1. 选择 s1.职业, s1.名字, s1.姓氏, s1.工资
  2. 员工 s1
  3. 其中 s1.工资 = (
  4. 选择 最大值(s2.工资)
  5. 员工 s2
  6. 其中 s2.职业 = s1.职业
  7. )
  8. s1.职业 升序排序;
英文:
  1. SELECT s1.Occupation, s1.First_Name, s1.Last_Name, s1.Salary
  2. FROM STAFF s1
  3. WHERE s1.Salary = (
  4. SELECT MAX(s2.Salary)
  5. FROM STAFF s2
  6. WHERE s2.Occupation = s1.Occupation
  7. )
  8. ORDER BY s1.Occupation ASC;

huangapple
  • 本文由 发表于 2023年5月6日 21:27:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/76189151.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定