当表中某个字段存在重复数据时,在它后面加序号
(Partition By与row_number()的用法小记)
应用场景
orcale 数据库的一个表中的一个字段存在多个相同的值,如下图所示:
现在要求处理这些相同编号的值,规则是如果相同就在后面加上【-’序号‘】,这就需要批量的去更新数据,那么问题来了,如何在一个语句中更新并在相同的编号后面再加一个【-“序号”】呢?我一开始想到的是分组然后取出每个组里的数据,然后在每个值的后面加一个【-1】,然后再筛选分组后数量大于1的然后取最后一位+1,。。。。依次往复。
这种想法太蠢了!
如果一个编号的重复数量是两位数或者三位数。那这种做法就是蠢他妈给蠢开门,蠢到家了。
于是我便开始了漫漫的百度路(可能是我基础太差,所以找了很久,但最终还是找到了。不得不说百度大法好!)
##文章地址:大佬的文章地址
https://blog.csdn.net/weixin_44547599/article/details/88764558
分区函数Partition By
(什么是分区函数呢,我也不是很清楚,去百度Google了一下,原文链接:分区函数和分区表)
于是我便尝试了一下:
select row_NUMBER() over (partition by PRODUCTDETAILID ORDER BY ID desc) rn, PRODUCTDETAILID
from TEMP_QM_PRODUCTDETAILINFO_bak
where PRODUCTDETAILID not like '%-%';
看到这个结果思路一下子清晰起来了:
merge into TEMP_QM_PRODUCTDETAILINFO_bak a
using (select row_NUMBER() over (partition by PRODUCTDETAILID ORDER BY ID desc) rn, PRODUCTDETAILID,ID from TEMP_QM_PRODUCTDETAILINFO_bak
where PRODUCTDETAILID not like '%-%') b
ON (a.ID = b.ID)
WHEN MATCHED THEN
update set a.PRODUCTDETAILID = b.PRODUCTDETAILID || '-'|| b.rn;
PS:我一开始在Navicat里面执行的语句,但是没有识别Partition by 总是提示无效字符,一度让我以为是我拼错了,也可能是我的版本问题(辣鸡Navicat),后来在dataGroup里面执行成功了。所以辣鸡Navicat