去除重重复行

    假设有如下数据窗口,数据窗口有两个列a和b,其中有9行数据,数据中a列有重复。

[c-sharp] view plain copy print ?
  1. a        b  
  2. ------------  
  3. A        1  
  4. A        2  
  5. B        3  
  6. C        4  
  7. C        5  
  8. D        6  
  9. E        7  
  10. E        8  
  11. E        9  

    在网上或者PB相关文献上我们经常可以看到(1)中所示的“数据窗口检查重复行”, 及(2)中所示的“如何在DataWindow中快速删除多行”的datawindow操作技巧。
应用是这样写的:

[c-sharp] view plain copy print ?
  1. 15、 如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行  
  2.   起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1"  
  3.   
  4. 21、 数据窗口检查重复行  
  5. dw_1.SetSort ("user_id A")  
  6. dw_1.Sort()  
  7. dw_1.SetFilter ("user_id = user_id[-1]")  
  8. dw_1.Filter()  
  9. if dw_1.RowCount() > 0 then  
  10.  Messagebox("注意""用户编码重复.")  
  11. end if  
  12. dw_1.SetFilter ("")  
  13. dw_1.Filter()  

    现在,本人将这些方法进行归纳,并提出(3)和(4)两种新的过滤方法。虽然仅有4种过滤方法,但是如果同时考虑primary!和filter!缓冲区中的数据,其实是提供了种过滤后的数据供使用。

 

(1)仅保留有重复的行中的后N - 1行(假设a列该值的重复行为N行,如:A值的重复行为2行,则保留后1行;E值的重复行为3行,则保留后2行)

[c-sharp] view plain copy print ?
  1. //写法   
  2. setfilter("a = a[-1]")  
  3.   
  4. //结果   
  5. a        b  
  6. ------------  
  7. A        2  
  8. C        5  
  9. E        8  
  10. E        9  

    此时filter!缓冲区中的数据为(2)中的数据

 

(2)留下Distinct a ,去除掉有重复的行中的后N - 1行(假设a列该值的重复行为N行,如:A值的重复行为2行,则去掉后1行;E值的重复行为3行,则去掉后2行)

[c-sharp] view plain copy print ?
  1. //写法   
  2. setfilter("not(a = a[-1])")  //网上通常以这样的写法来实现:setfilter("a <> a[-1] or getrow() = 1")   
  3.   
  4. //结果   
  5. setfilter("a <> a[-1] or getrow() = 1")  
  6. a        b  
  7. ------------  
  8. A        1  
  9. B        3  
  10. C        4  
  11. D        6  
  12. E        7  

    此时filter!缓冲区中的数据为(1)中的数据

 

(3)留下Distinct a ,去除掉有重复的行中的前N - 1行(假设a列该值的重复行为N行,如:A值的重复行为2行,则去掉前1行;E值的重复行为3行,则去掉前2行)

[c-sharp] view plain copy print ?
  1. //写法   
  2. setfilter("not(a[1] = a)")  
  3.   
  4. //结果   
  5. a        b  
  6. ------------  
  7. A        2  
  8. B        3  
  9. C        5  
  10. D        6  
  11. E        9  

    此时filter!缓冲区中的数据为“有重复的行中的前N - 1行

 

(4)仅保留有重复的行(假设a列该值的重复行为N行,如:A值的重复行为2行,则A全保留;E值的重复行为3行,则E也全保留;B值的没有重复行,则过滤)

[c-sharp] view plain copy print ?
  1. //写法   
  2. setfilter("a = a[-1] or a[1] = a")  
  3.   
  4. //结果   
  5. a        b  
  6. ------------  
  7. A        1  
  8. A        2  
  9. C        4  
  10. C        5  
  11. E        7  
  12. E        8  
  13. E        9  

    此时filter!缓冲区中的数据为“所有没有重复的行

    注意,上述所以filter操作执行的前提是数据窗口中的数据按照所要filter的列进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值