在函数 Oracle PLSQL 中带最高薪水员工 id 的查询?
Posted
技术标签:
【中文标题】在函数 Oracle PLSQL 中带最高薪水员工 id 的查询?【英文标题】:Query that brings the id of the employee with the highest salary in a function Oracle PLSQL? 【发布时间】:2020-02-21 12:45:10 【问题描述】:我有以下问题: 我需要创建一个函数 PLSQL,它将职位作为参数并返回员工的最高薪水 ID。如果您有多个,请退回最近雇用日期的那个。
EMP (table)
empno (id)
ename (employee name)
job (occupation)
mgr (boss id)
hiredate (hiring date)
sal (salary)
comm (commission)
depto (Department)
由于我是 SQL 新手,希望您能帮助解决这个问题。谢谢!
【问题讨论】:
样本数据和期望的结果将阐明您想要做什么。 最初将是工作参数的条目(例如:分析师),并且必须返回具有最高薪水的员工 ID。返回示例(empno:2455)。如果您有不止一名员工,请提供最近的招聘日期,例如:(3555 - 02/21/2020)。 如果你想学习一些东西,你应该尝试自己编写这个函数,而不仅仅是复制粘贴。或者至少搜索数百个类似的答案,例如:How to get the highest paid employee row。 【参考方案1】:样本数据:
SQL> SELECT empno, ename, job, sal, hiredate
2 FROM emp
3 ORDER BY job, sal DESC, hiredate DESC;
EMPNO ENAME JOB SAL HIREDATE
---------- ---------- --------- ---------- --------
7788 SCOTT ANALYST 3000 09.12.82
7902 FORD ANALYST 3000 03.12.81
7876 ADAMS CLERK 1300 12.01.83 --> highest ranked CLERK
7934 MILLER CLERK 1300 23.01.82
7900 JAMES CLERK 950 03.12.81
7369 SMITH CLERK 920 17.12.80
7566 JONES MANAGER 2975 02.04.81
7698 BLAKE MANAGER 2850 01.05.81
7782 CLARK MANAGER 2450 09.06.81
7839 KING PRESIDENT 10000 17.11.81
7499 ALLEN SALESMAN 1600 20.02.81 --> highest ranked SALESMAN
7844 TURNER SALESMAN 1500 08.09.81
7654 MARTIN SALESMAN 1250 28.09.81
7521 WARD SALESMAN 1250 22.02.81
14 rows selected.
功能:使用row_number
分析函数根据员工的薪水和雇用日期排序。代码包含一些多余的数据,但如果您想单独使用它的select
来查看发生了什么,它会有所帮助。
SQL> CREATE OR REPLACE FUNCTION f_sal (par_job IN emp.job%TYPE)
2 RETURN emp.empno%TYPE
3 IS
4 retval emp.empno%TYPE;
5 BEGIN
6 SELECT empno
7 INTO retval
8 FROM (SELECT empno,
9 ename,
10 job,
11 sal,
12 hiredate,
13 ROW_NUMBER ()
14 OVER (PARTITION BY job ORDER BY sal DESC, hiredate DESC)
15 rn
16 FROM emp
17 WHERE job = par_job)
18 WHERE rn = 1;
19
20 RETURN retval;
21 EXCEPTION
22 WHEN NO_DATA_FOUND
23 THEN
24 RETURN NULL;
25 END;
26 /
Function created.
SQL>
测试:
SQL> SELECT f_sal ('CLERK') result FROM DUAL;
RESULT
----------
7876
SQL> SELECT f_sal ('SALESMAN') result FROM DUAL;
RESULT
----------
7499
SQL> SELECT f_sal ('hotfix') result FROM DUAL;
RESULT
----------
SQL>
【讨论】:
no_data_found 是怎么回事? :) 数据总会被找到,@hotfix。至少,在我的宇宙中(由这个例子表示):) 我的意思是如果你调用一个没有工作的函数 我知道你的意思,@hotfix;只是在开玩笑。谢谢评论,我修改了功能代码。以上是关于在函数 Oracle PLSQL 中带最高薪水员工 id 的查询?的主要内容,如果未能解决你的问题,请参考以下文章
9取得薪水最高的前五名员工bjpowernode34道SQL题