问题描述
因为周末几天的数据库出了点问题,在补充几天数据的时候,忘记更改了日期,导致补充到数据库的数据多了一些重复数据,如下图所示:
解决办法
经过资料查找,用到了rowid, row_number(), partition by,
rowid是Oracle数据库特有的,是一串随机生成的字符串,用来表示特定的某一行,如下图,rid作为每一行的唯一id标识:
此时再用row_number() 结合partition by 添加一列排序列,然后作为条件筛选rid,如下:
select t1.*,rowid rid,row_number() over (partition by t1.SD_DATE,t1.STREET order by RATE) rn from FGFC_TMP_BACKUP t1 where SD_DATE='20211220' order by STREET,RATE;
然后就可以根据需要筛选出想要删除的数据了
# 筛选出想要删除的数据
select * from FGFC_TMP_BACKUP t where t.rowid in
(select rid from
(select t1.*,rowid rid,row_number() over (partition by t1.SD_DATE,t1.STREET order by RATE) rn from FGFC_TMP_BACKUP t1 where SD_DATE='20211220' order by STREET,RATE) t2
where t2.rn=1);
# 删掉想要删除的数据
delete from FGFC_TMP_BACKUP t where t.rowid in
(select rid from
(select t1.*,rowid rid,row_number() over (partition by t1.SD_DATE,t1.STREET order by RATE) rn from FGFC_TMP_BACKUP t1 where SD_DATE='20211220' order by STREET,RATE) t2
where t2.rn=1);
关于rowid,rownum,partition by的更多使用方法以后再补充。
参考链接:
oracle数据库之rownum和rowid用法 - 一飞要上天 - 博客园