Как получить последнюю дату записи за каждый год для сотрудника - PullRequest
0 голосов
/ 18 июня 2020

Я работаю над подробностями истории эффективности сотрудников oracle би отчет. В котором я застрял в сценарии ниже. У каждого сотрудника есть несколько строк на каждый год. Но я хотел извлечь только последнюю датированную запись за каждый год для всех сотрудников.

Пример:

Доступные данные:

Employee_number   Effective_date   Name    Performance_rating   Comments  
----------------- ---------------- ------- -------------------- ---------- 
1001              01/01/2017       Emp01   4.0                  Good      
1001              01/06/2017       Emp01   4.0                  Good      
1001              01/12/2017       Emp01   4.0                  Good      
1001              01/01/2018       Emp01   3.8                  Good      
1001              01/06/2018       Emp01   3.8                  Good      
1001              01/02/2019       Emp01   4.0                  Good      
1001              01/08/2019       Emp01   4.0                  Good      

В приведенной выше таблице я хотел извлекать только последнюю датированную запись за каждый год.

Ожидаемый результат:

Employee_number   Effective_date   Name    Performance_rating   Comments  
----------------- ---------------- ------- -------------------- ---------- 
1001              01/12/2017       Emp01   4.0                  Good      
1001              01/06/2018       Emp01   3.8                  Good      
1001              01/08/2019       Emp01   4.0                  Good      

Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Я бы использовал функцию ROW_NUMBER analyti c:

with temp as
  (select employee_number, 
          effective_date,
          name,
          performance_rating,
          comments,
          --
          row_number() over (partition by employee_number, extract (year from effective_date)
                             order by effective_date desc
                            ) rn
   from your_table
  )
select employee_number,
       effective_date,
       name,
       performance_rating,
       comments           
from temp
where rn = 1
order by employee_number, effective_date;
0 голосов
/ 18 июня 2020

Вы также можете сделать это с помощью коррелированного подзапроса:

select t.*
from t
where t.effective_date = (select max(t2.effective_date)
                          from t t2
                          where t2.employee_number = t.employee_number and
                                trunc(t2.employee_number, 'YYYY') = trunc(t.employee_number, 'YYYY')
                         );

Было бы интересно узнать, что быстрее - подход row_number() или коррелированный подзапрос.

0 голосов
/ 18 июня 2020

Попробуйте с оконной функцией row_number() и вот демонстрация .

select
    Employee_number,
    Effective_date,
    Name,
    Performance_rating,
    comments
from
(
    select
        Employee_number,
        Effective_date,
        Name,
        Performance_rating,
        comments,
        row_number() over (partition by Employee_number, extract(year from Effective_date) order by Effective_date desc) as rn
    from yourTable
) subq
where rn = 1
...