plsql - Using LAG to Find Previous Value in Oracle -
i'm trying use lag function in oracle find previous registration value donors.
to see data, started query find registrations particular donor:
select registration_id, registration_date registration r r.person_id=52503290 order r.registration_date desc;
then used lag
function return previous value along recent value:
select registration_id reg_id, registration_date reg_date, lag(registration_date,1) on (order registration_date) prev_reg_date registration person_id=52503290 order registration_date desc;
and results expected:
so thought should place lag
function within main query previous value reason, previous value returns null or no value @ all.
select p.person_id person_id, r.registration_date drive_date, lag(r.registration_date,1) on (order r.registration_date) previous_drive_date, p.abo blood_type, dt.description donation_type person p join registration r on p.person_id = r.person_id , p.first_name <> 'pooled' , p.first_name <> 'import' left outer join drives dr on r.drive_id = dr.drive_id , dr.group_id <> 24999 left outer join branches b on r.branch_id = b.branch_id left outer join donor_group dg on dr.group_id = dg.group_id left outer join donation_type dt on r.donation_type_id = dt.donation_type_id trunc(r.registration_date) = trunc(sysdate)-1 , r.person_id=52503290 order r.registration_date desc;
here result set:
any suggestions on missing here? or why query isn't returning values expected?
based on @alex poole's suggestions, changed query like:
select * ( select p.person_id person_id, r.registration_date drive_date, lag(r.registration_date,1) on (partition p.person_id order r.registration_date) previous_drive_date, p.abo blood_type, dt.description donation_type person p join registration r on p.person_id = r.person_id , p.first_name <> 'pooled' , p.first_name <> 'import' left outer join drives dr on r.drive_id = dr.drive_id , dr.group_id <> 24999 left outer join branches b on r.branch_id = b.branch_id left outer join donor_group dg on dr.group_id = dg.group_id left outer join donation_type dt on r.donation_type_id = dt.donation_type_id --where r.person_id=52503290 ) trunc(drive_date) = trunc(sysdate)-1 order drive_date desc;
it takes 85 seconds pull first 30 rows:
my original query (before lag
function added) took 2 seconds pull approximately 2100 records. nothing select couple of joins , 1 item in clause.
looking @ record counts, person has 5.5 million records , registration has 9.1 million records.
the lag applied within rows match where
clause filter, see previous value if yesterday.
you can apply lag in subquery, , filter in outer query:
select * ( select p.person_id person_id, r.registration_date drive_date, lag(r.registration_date,1) on (order r.registration_date) previous_drive_date, p.abo blood_type, dt.description donation_type person p join registration r on p.person_id = r.person_id , p.first_name <> 'pooled' , p.first_name <> 'import' left outer join drives dr on r.drive_id = dr.drive_id , dr.group_id <> 24999 left outer join branches b on r.branch_id = b.branch_id left outer join donor_group dg on dr.group_id = dg.group_id left outer join donation_type dt on r.donation_type_id = dt.donation_type_id r.person_id=52503290 ) trunc(drive_date) = trunc(sysdate)-1 order drive_date desc;
Comments
Post a Comment