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