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.