Пример данных:
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
analyti c для сортировки сотрудников по их зарплате и дате найма. Код содержит некоторые лишние данные, но он поможет, если вы хотите использовать его 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>