如何基于多列匹配值清空/修改数据行中的值?
基于多列匹配值清空/修改数据行中的值
本问题需要基于其他列的匹配属性,仅操作特定列的行数据。给定数据集包含物品相关信息:物品ID(ID)、时间周期(ATTR2,即月份)、关联人员(Name)、人员角色(ATTR1)。
核心需求
当某个人在特定月份为某个物品承担多个角色时,仅保留一行有效数值,其余该匹配组合下的条目需设为0或空值。有效行需根据ATTR1字段的排名(ATTR1_RANK)选取:例如Ash在2021年1月为物品900001担任R1-R6角色,共6行数据,仅ATTR1=R1的行保留有效数值,其余行需更新为0或空值。
补充说明
R1、R2并非总是存在,有时可能仅包含R7、R9或R4、R6等角色。
示例数据(MRE)
with tbl ( ID ,ATTR2 ,Name ,ATTR1 , ATTR1_RANK ,Col1 ,Col2 ,Col3 ,Col4 ) as ( select '900001' ,'JAN-21' ,'Ash' ,'R1', 1 ,100 ,200 ,300 ,50 from dual union select '900001' ,'JAN-21' ,'Ash' ,'R2', 2 ,100 ,200 ,300 ,50 from dual union select '900001' ,'JAN-21' ,'Ash' ,'R3', 3 ,100 ,200 ,300 ,50 from dual union select '900001' ,'JAN-21' ,'Ash' ,'R4', 4 ,100 ,200 ,300 ,50 from dual union select '900001' ,'JAN-21' ,'Ash' ,'R5', 5 ,100 ,200 ,300 ,50 from dual union select '900001' ,'JAN-21' ,'Ash' ,'R6', 6 ,100 ,200 ,300 ,50 from dual union select '790001' ,'JUN-22' ,'Jon' ,'R1', 1 ,9900 ,-91 ,-91 ,8181 from dual union select '790001' ,'JUN-22' ,'Jon' ,'R2', 2 ,9900 ,-91 ,-91 ,8181 from dual union select '790001' ,'AUG-22' ,'Jon' ,'R1', 1 ,9900 ,-91 ,-91 ,8181 from dual union select '790001' ,'AUG-22' ,'Jon' ,'R2', 2 ,9900 ,-91 ,-91 ,8181 from dual ) select * from tbl ;
我的思路与问题
目前的实现思路:仅筛选满足count(rows) over ( partition by ID, ATTR2, Name ) > 1的行,在这些数据中,再筛选满足count(*) over ( partition by ID, ATTR2, Name order by ATTR1_RANK ) >1的行并将其设为0。
我已经能识别需要修改的行,但不清楚如何合并/更新数据,同时希望写出适配百万级数据的高效算法。
内容的提问来源于stack exchange,提问作者Joe_sushi39
相关产品推荐
相关产品推荐

