Oracle SQL Update using group by/case -
i have record table1 structure
key1 key2 key3 emplid enrcd addl_seq ... (key1 key2 key3 emplid enrcd addl_seq) being keys i have rows emplid & erncd same different values of key1/2/3 increment addl_seq value 1 when multiple rows exist same emplid & erncd
example
- key1 key2 key3 emplid erncd addl_seq 001 a1 b1 12345 reg 1 001 a1 b2 12345 reg 2 updated sql update ps_xx_py40_apay_1 a1 set a1.addl_seq = ( select rank() over(partition xx_employee_id,erncd order xx_conversion_id,xx_ucpath_loc,xx_wrkr_instance,xx_appt_num,xx_dist_num,empl_rcd,emplid,effdt) ps_xx_py40_apay_1 b1 b1.xx_employee_id=a1.xx_employee_id , b1.erncd=a1.erncd , xx_conversion_id=xx_conversion_id , xx_ucpath_loc=xx_ucpath_loc , a1.xx_wrkr_instance=b1.xx_wrkr_instance , b1.xx_appt_num=a1.xx_appt_num , b1.xx_dist_num=a1.xx_dist_num , a1.emplid=b1.emplid , a1.empl_rcd=b1.empl_rcd , a1.effdt=b1.effdt ); where keys joined. however, results not desired
result
004720864 rgn 1 004720864 rgn 1 004720864 rgn 1 004720864 rgn 1 expected
004720864 rgn 1 004720864 rgn 2 004720864 rgn 3 004720864 rgn 4
the problem update statement, , 1 suggested in tim's answer, don't take account rank or row_number analytic function gets computed after where clause has been applied. so, in effect, analytic function computed on single row, return 1. not want.
here way perform update using merge statement should work you:
merge table1 dest using ( select key1, key2, key3, emplid, enrcd, row_number() on (partition emplid, enrcd order key1, key2, key3) addl_seq table1 ) src on ( src.key1 = dest.key1 , src.key2 = dest.key2 , src.key3 = dest.key3 , src.emplid = dest.emplid , src.enrcd = dest.enrcd ) when matched update set dest.addl_seq = src.addl_seq
Comments
Post a Comment