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);
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页