怎样用 esProc 将数据集中重复内容置空
某库表的前两个字段会同时出现重复值,比如下面的前 3 条记录。
| Column_A | Column_B | Column_C | 
| 1 | AB | amount1 | 
| 1 | AB | amount2 | 
| 1 | AB | amount3 | 
| 2 | OA | amount4 | 
| 3 | OE | amount5 | 
| 3 | OE | amount6 | 
| 4 | DB | amount7 | 
现在要将所有的重复值改成 null,换句话说,按前 2 个字段分组后(等价于按其中 1 个字段分组),只保留组内第一条不变,其他记录的前两个字段改成 null。
计算结果像下面这样:
| Column_A | Column_B | Column_C | 
| 1 | AB | amount1 | 
| amount2 | ||
| amount3 | ||
| 2 | OA | amount4 | 
| 3 | OE | amount5 | 
| amount6 | ||
| 4 | DB | amount7 | 
SQL分组后必须立刻汇总,不能保持分组子集继续计算,也没有天然的组内行号,代码比较难写。
esProc提供了丰富的计算函数,可以保持分组子集继续计算,有天然的行号,包括组内行号:esProc Web Try
| A | |
| 1 | $select * from table_name.txt | 
| 2 | =A1.group(Column_A) | 
| 3 | =A2.run(~.(if(#!=1,Column_A=Column_B=null))) | 
| 4 | =A3.conj() | 
A1:加载数据。
A2:用 group 函数按第 1 个字段分组,但不汇总。

 每组是一个集合,可以通过点击展开,如图是前两组。

 A2:用 run 函数修改各组数据,当成员在组内的序号大于 1 时,将前两个字段改为 null。~ 表示当前组,# 表示组内序号。

 A3:合并各组。

上面分步骤的代码有利于学习和调试,熟练后 A2-A4 可以合为一句:
=A1.group(Column_A).run(~.(if(#!=1,Column_A=Column_B=null))).conj()esProc是开源免费的,下载试用~
