oracle数据排重-两种分组方式
一、简述
生产环境因为某些原因,上游系统防重出现漏洞,需要筛选出所有的重复数据,并对重复数据进行修改,修改重复数据的非第一次请求的数据状态。
二、oracle的两种分组
第一种就是很常用的group by
但是这种分组无法查询非分组字段的数据。
第二种:ROW_NUMBER () OVER (
PARTITION BY 需要分组字段(比如 省码,活动编码) ORDER BY 排序字段(比如请求时间)
) NUM num:代表按指定字段进行分组后的每一条数据在相同省码,活动编码的数据的序号。排重就可以根据这个序号,来取。 比如 num=1的数据就是所有相同省码,活动编码的数据的第一条数据。但如果没有重复也会取出唯一的那条。 本次解决生产问题就是使用的num>1,代表取出所有相同省码,活动编码的数据的非第一条的数据完成了排重。然后将这些数据导出到下游库临时表中,保留下重复数据中的最早请求的那一条(序号为1的数据)。下游再将自己的业务表和临时表联查,将上游业务id在这个表中的数据都软删除。
三、sql:
查询上游表
SELECT * FROM ( SELECT T.*, ROW_NUMBER () OVER ( PARTITION BY province_code,ac_code ORDER BY requset_time ) NUM FROM pg_order T ) ttt WHERE ttt.NUM > 1;
更新下游表
UPDATE PP_DISTRIBUT_ORDER SET DISTRIBUT_STATUS = 99 WHERE REQUEST_TIME >= TO_DATE ( 2020-11-20 00:00:00, YYYY-MM-DD HH24:MI:SS ) AND REQUEST_TIME <= TO_DATE ( 2020-11-21 06:00:00, YYYY-MM-DD HH24:MI:SS ) and BUSS_ID in ( select id from temp_table);