Как использовать ранг, чтобы получить последнюю бонусную запись

В настоящее время я использую приведенный ниже запрос, чтобы получить сумму бонуса для сотрудников за предыдущий год. Но я сталкиваюсь с некоторыми проблемами, поэтому я пытаюсь получить последнее значение записи элемента (значение экранной записи) для элемента «бонус xyz» с помощью функции RANK (). Пожалуйста помоги. Благодарю.

Select 
Pam.assignment_number,
Peev.screen_entry_value as bonus_amount
From
Per_all_assignments_m Pam,
Pay_element_entries_f peef,
Pay_element_types_tl petl,
Pay_element_entry_values_f peev
Where
Pam.Person_id=peef.person_id
and peef.element_type_id = petl. element_type_id
And peef.element_entry_id = peev. element_entry_id
And petl.language=‘US’
And to_char(peef.effective_start_date,’yyyy’)=(to_char(sysdate,’yyyy’)-1)
And to_char(peev.effective_start_date,’yyyy’)=(to_char(sysdate,’yyyy’)-1)
And petl.element_name = ‘xyz bonus’

Всего 1 ответ


Поскольку у меня нет ваших таблиц, я использую образец таблицы EMP Скотта.

Там строки, отсортированные по зарплате на отдел, выглядят так:

SQL> select deptno,
  2         ename,
  3         sal,
  4         rank() over (partition by deptno order by sal desc) rn
  5  from emp
  6  order by deptno,
  7           sal desc;

    DEPTNO ENAME             SAL         RN
---------- ---------- ---------- ----------
        10 KING            10000          1
        10 CLARK            2450          2
        10 MILLER           1300          3
        20 SCOTT            3000          1
        20 FORD             3000          1
        20 JONES            2975          3
        20 ADAMS            1100          4
        20 SMITH             920          5
        30 BLAKE            2850          1
        30 ALLEN            1600          2
        30 TURNER           1500          3
        30 MARTIN           1250          4
        30 WARD             1250          4
        30 JAMES             950          6

14 rows selected.

SQL>

Если вы хотите получить самую высокую зарплату по отделу, вы бы тогда

SQL> select deptno, ename, sal
  2  from (select deptno,
  3               ename,
  4               sal,
  5               rank() over (partition by deptno order by sal desc) rn
  6        from emp
  7       )
  8  where rn = 1;

    DEPTNO ENAME             SAL
---------- ---------- ----------
        10 KING            10000
        20 SCOTT            3000
        20 FORD             3000
        30 BLAKE            2850

SQL>

Я думаю, это то, что вы ищете.


Ваш запрос может выглядеть так:

Select 
  Pam.assignment_number,
  Peev.screen_entry_value as bonus_amount,
  rank() over (partition by pam.assignment_number order by peev.screen_entry_value desc) rn
From
  ...

Теперь используйте его в качестве встроенного представления (или CTE) и извлекайте нужные значения.


Если это не то, что вы ищете, пожалуйста, опубликуйте пример данных и желаемый результат.


Есть идеи?

10000