样本数据:
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>