怎样用 esProc 检查组内各行数据的相同状态

某库表的 ID 字段是汽车的分类,每类汽车再细分为品牌和型号。

ID

Brand

Type

1

Honda

Coupe

1

Jeep

SUV

2

Ford

Sedan

2

Ford

Crossover

现在要按 ID 分组,计算出该组汽车的差异是在品牌上还是在型号上,如果组内汽车的品牌不止一个,则将计算列 difference 赋值为 Brand;如果组内汽车的型号不止一个,则将 difference 赋值为 Type。

ID

Difference

1

Brand

1

Type

2

Type

SQL 分组后必须立刻汇总,难以在分组子集中进行逻辑判断,间接实现的代码很复杂。SPL 可以保留分组子集继续计算:https://try.esproc.com/splx?3c3


 A

1

$select * from tbl.txt

2

=A1.group(ID)

3

=A2.(if(~.icount(Brand)>1,new(ID,"Brand":Difference))|if(~.icount(Type)>1,new(ID,"Type":Difference)))

4

=A3.conj()

A1:加载数据。

A2:用 group 函数按 ID 分组,但不汇总,每组是一个记录集合。

Picture1png
A3:处理每组数据:如果当前组的 Brand 去重计数后大于 1,则新建一条记录,字段 ID 取自当前组,字段 Difference 为字符串”Brand”;对当前组的 Type 字段也做类似处理,但新记录的 Difference 字段为字符串”Type”。符号 ~ 表示当前组,icount 函数用于去重计数,符号 | 可将新记录(或任意数据)合并成集合。

Picture2png
A4:合并各组数据的成员。

Picture3png
上面 A2-A4 是分步计算,便于调试,也可以合为一句:

=A1.group(ID). conj(if(~.icount(Brand)>1,new(ID,"Brand":Difference))|if(~.icount(Type)>1,new(ID,"Type":Difference)))