假设有如下数据窗口,数据窗口有两个列a和b,其中有9行数据,数据中a列有重复。
a b ------------ A 1 A 2 B 3 C 4 C 5 D 6 E 7 E 8 E 9
在网上或者PB相关文献上我们经常可以看到(1)中所示的“数据窗口检查重复行”, 及(2)中所示的“如何在DataWindow中快速删除多行”的datawindow操作技巧。
应用是这样写的:
15、 如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行 起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1" 21、 数据窗口检查重复行 dw_1.SetSort ("user_id A") dw_1.Sort() dw_1.SetFilter ("user_id = user_id[-1]") dw_1.Filter() if dw_1.RowCount() > 0 then Messagebox("注意", "用户编码重复.") end if dw_1.SetFilter ("") dw_1.Filter()
现在,本人将这些方法进行归纳,并提出(3)和(4)两种新的过滤方法。虽然仅有4种过滤方法,但是如果同时考虑primary!和filter!缓冲区中的数据,其实是提供了⑥种过滤后的数据供使用。
(1)仅保留有重复的行中的后N - 1行①(假设a列该值的重复行为N行,如:A值的重复行为2行,则保留后1行;E值的重复行为3行,则保留后2行)
//写法 setfilter("a = a[-1]") //结果 a b ------------ A 2 C 5 E 8 E 9
此时filter!缓冲区中的数据为(2)中的数据
(2)留下Distinct a ,去除掉有重复的行中的后N - 1行②(假设a列该值的重复行为N行,如:A值的重复行为2行,则去掉后1行;E值的重复行为3行,则去掉后2行)
//写法 setfilter("not(a = a[-1])") //网上通常以这样的写法来实现:setfilter("a <> a[-1] or getrow() = 1") //结果 setfilter("a <> a[-1] or getrow() = 1") a b ------------ A 1 B 3 C 4 D 6 E 7
此时filter!缓冲区中的数据为(1)中的数据
(3)留下Distinct a ,去除掉有重复的行中的前N - 1行③(假设a列该值的重复行为N行,如:A值的重复行为2行,则去掉前1行;E值的重复行为3行,则去掉前2行)
//写法 setfilter("not(a[1] = a)") //结果 a b ------------ A 2 B 3 C 5 D 6 E 9
此时filter!缓冲区中的数据为“有重复的行中的前N - 1行④”
(4)仅保留有重复的行⑤(假设a列该值的重复行为N行,如:A值的重复行为2行,则A全保留;E值的重复行为3行,则E也全保留;B值的没有重复行,则过滤)
//写法 setfilter("a = a[-1] or a[1] = a") //结果 a b ------------ A 1 A 2 C 4 C 5 E 7 E 8 E 9
此时filter!缓冲区中的数据为“所有没有重复的行⑥”
注意,上述所以filter操作执行的前提是数据窗口中的数据按照所要filter的列进行排序。