简体   繁体   中英

How to get Last dated record for each year for an employee

I m working on employee performance history details oracle bi report. In which I was stuck with the below scenario. Each employee has multiple rows for each year. But I wanted to extract only the last dated record for each year for all the employees.

Example:

Available data:

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      

In the above table, I wanted to extract only the last dated record for every year.

Expected result:

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      

Please help

Try with window function row_number() and here is the demo .

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

I'd use ROW_NUMBER analytic function:

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;

You can also do this with a correlated subquery:

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')
                         );

It would be interesting to know which is faster -- the row_number() approach or the correlated subquery.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM