Запрос Oracle, чтобы найти сотрудника, который принял максимальное количество отпусков за последний месяц - PullRequest
0 голосов
/ 27 мая 2018

У меня есть эти таблицы со следующими столбцами:

Employee24 ( EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER );

Leave25 ( EMPLOYEEID, LEAVEID, LEAVETYPE, STARTDATE, ENDDATE, NOOFDAYS );

Я хочу написать запрос, чтобы найти сотрудника, который набрал максимальное количестволистьев за последний месяц

SELECT * 
  FROM EMPLOYEE24 
 WHERE EMPLOYEEID IN (SELECT EMPLOYEEID 
                        FROM LEAVE25 
                       WHERE STARTDATE < ADD_MONTHS(SYSDATE, -1));

1 Ответ

0 голосов
/ 27 мая 2018

Если ваша версия БД 12c , вы можете использовать Ограничение строк для запросов Top-N , как показано ниже:

SELECT e.*, l.max_leaves
  FROM (SELECT employeeid, count(1) as max_leaves
        FROM LEAVE25 
        WHERE startdate >= add_months(sysdate, -1)
        GROUP BY employeeid           
       ) l JOIN
       EMPLOYEE24 e 
       ON ( e.employeeid = l.employeeid )
 ORDER BY l.max_leaves DESC
 FETCH FIRST 1 ROWS WITH TIES; -- including the same highest leave owners

Если версия 11g , тогда используйте Dense_Rank и Count с вложенным запросом , как показано ниже:

SELECT e.*, l.max_leaves
  FROM (SELECT employeeid, count(1) as max_leaves, 
               dense_rank() over (order by count(1) desc) dr
        FROM LEAVE25 
        WHERE startdate >= add_months(sysdate, -1)
        GROUP BY employeeid           
       ) l JOIN
       EMPLOYEE24 e
       ON ( e.employeeid = l.employeeid )
 WHERE l.dr = 1;

Демонстрация SQL Fiddle для 11g

...