Запрос, который возвращает идентификатор сотрудника с самой высокой зарплатой в функции Oracle PL SQL? - PullRequest
0 голосов
/ 21 февраля 2020

У меня следующая проблема: мне нужно создать функцию PL SQL, которая принимает позицию в качестве параметра и возвращает идентификатор максимальной зарплаты сотрудника. Если у вас их больше одного, верните тот, у которого была самая поздняя дата найма.

EMP (table)
  empno (id)
  ename (employee name)
  job (occupation)
  mgr (boss id)
  hiredate (hiring date)
  sal (salary)
  comm (commission)
  depto (Department)

Поскольку я новичок в SQL, я надеюсь, что вы поможете решить эту проблему. Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2020

Пример данных:

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>
...