一个删除重复数据不错的例子

MERGE INTO删除记录

在itpub上看了一帖子http://www.itpub.net/thread-1570535-1-1.html


需求:

[sql]   view plain copy
  1. SQL> SELECT * FROM tmp;  
  2.   
  3.         ID PROJECT              PDATE                 CNT  
  4. ---------- -------------------- -------------- ----------  
  5.          1 pro1                 06-2月 -12              2  
  6.          1 pro1                 07-2月 -12             10  
  7.          1 pro1                 08-2月 -12             10  
  8.          1 pro1                 09-2月 -12             20  
  9.          2 pro2                 10-2月 -12              5  
  10.          2 pro2                 11-2月 -12              5  
  11.   
  12. 已选择6行。  
以tmp表查询结果为例,删除id与project相同的其它记录,只保存最早的那条数据 ,并且改变最早的那条记录的数量为id与project相同的所有记录的cnt之和,比如id=1,project='pro1'的所有记录cnt之和42。


[sql]   view plain copy
  1. SQL> SELECT * FROM tmp;  
  2.   
  3.         ID PROJECT              PDATE                 CNT  
  4. ---------- -------------------- -------------- ----------  
  5.          1 pro1                 06-2月 -12              2  
  6.          1 pro1                 07-2月 -12             10  
  7.          1 pro1                 08-2月 -12             10  
  8.          1 pro1                 09-2月 -12             20  
  9.          2 pro2                 10-2月 -12              5  
  10.          2 pro2                 11-2月 -12              5  
  11.   
  12. 已选择6行。  
  13.   
  14. SQL> --以id,project分区并求和  
  15. SQL> SELECT ROWID rid, id,project,pdate,cnt,  
  16.   2         SUM (cnt) OVER (PARTITION BY id, project) sum_qty from tmp  ;  
  17.   
  18. RID                        ID PROJECT              PDATE                 CNT    SUM_QTY  
  19. ------------------ ---------- -------------------- -------------- ---------- ----------  
  20. AAANCZAAEAAAAH9AAG          1 pro1                 06-2月 -12              2         42  
  21. AAANCZAAEAAAAH9AAH          1 pro1                 07-2月 -12             10         42  
  22. AAANCZAAEAAAAH9AAI          1 pro1                 08-2月 -12             10         42  
  23. AAANCZAAEAAAAH9AAJ          1 pro1                 09-2月 -12             20         42  
  24. AAANCZAAEAAAAH9AAK          2 pro2                 10-2月 -12              5         10  
  25. AAANCZAAEAAAAH9AAL          2 pro2                 11-2月 -12              5         10  
  26.   
  27. 已选择6行。  
  28.   
  29. SQL> --以id,project分区并求和,并 使用DENSE_RANK为记录编号  
  30. SQL> SELECT ROWID rid,project,pdate,cnt,  
  31.   2         SUM (cnt) OVER (PARTITION BY id, project) sum_qty,  
  32.   3         DENSE_RANK () OVER (PARTITION BY id, project ORDER BY pdate ) rn  
  33.   4    FROM tmp;  
  34.   
  35. RID                PROJECT              PDATE                 CNT    SUM_QTY         RN  
  36. ------------------ -------------------- -------------- ---------- ---------- ----------  
  37. AAANCZAAEAAAAH9AAG pro1                 06-2月 -12              2         42          1  
  38. AAANCZAAEAAAAH9AAH pro1                 07-2月 -12             10         42          2  
  39. AAANCZAAEAAAAH9AAI pro1                 08-2月 -12             10         42          3  
  40. AAANCZAAEAAAAH9AAJ pro1                 09-2月 -12             20         42          4  
  41. AAANCZAAEAAAAH9AAK pro2                 10-2月 -12              5         10          1  
  42. AAANCZAAEAAAAH9AAL pro2                 11-2月 -12              5         10          2  
  43.   
  44. 已选择6行。  
  45.   
  46. SQL> --使用merge into 更新并删除相关记录  
  47. SQL> MERGE INTO tmp t1  
  48.   2       USING (SELECT ROWID rid,  
  49.   3                     project,  
  50.   4                     pdate,  
  51.   5                     cnt,  
  52.   6                     SUM (cnt) OVER (PARTITION BY id, project) sum_qty,  
  53.   7                     DENSE_RANK ()  
  54.   8                        OVER (PARTITION BY id, project ORDER BY pdate)  
  55.   9                        rn  
  56.  10                FROM tmp) t2  
  57.  11          ON (t1.ROWID = t2.rid)  
  58.  12  WHEN MATCHED  
  59.  13  THEN  
  60.  14     UPDATE SET t1.cnt = sum_qty  
  61.  15     DELETE  
  62.  16             WHERE (t2.rn <> 1);  
  63.   
  64. 6 行已合并。  
  65.   
  66. --显示了正确的结果  
  67. SQL> SELECT * FROM tmp;  
  68.   
  69.         ID PROJECT              PDATE                 CNT  
  70. ---------- -------------------- -------------- ----------  
  71.          1 pro1                 06-2月 -12             42  
  72.          2 pro2                 10-2月 -12             10 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值