3.2.2等值分组

我们经常需要根据某个值,将数据分组,如按部门将员工分组,按性别将人员分组等。在集算器中,可以用group函数将序表或排列中的数据分组,并返回各组构成的序列。如:

 

A

1

=demo.query("select * from EMPLOYEE")

2

=A1.group(DEPT)

3

=A1.group@o(DEPT)

4

=A1.group(year(BIRTHDAY))

A2将员工按部门DEPT分组,结果如下:

可以发现,结果是由分组构成的序列,而每个分组都是同一个部门的员工数据组成的排列,而各个组是按照部门升序排序的。

在使用group函数时,同样可以用@o选项,表示不打乱顺序,只将相邻的同值数据合并为一组。如A3中按部门分组时,只将相邻的同部门员工分在一组,结果如下:

分组时,同样可以根据某个表达式,将结果相同的数据分在一组中。如A4中按出生年份将员工分组,结果如下:

group函数类似SQL中的group by运算。它的返回值是由各个分组构成的序列,最后结果是个由序列构成的序列。分组汇总值可基于分组结果继续多次计算。这与SQL不同,SQL中没有显式的集合数据类型,不能保存分组结果,必须在group by后立即计算出分组汇总值,运算后分组结果将被丢弃而不能重复利用。

在集算器中,分组后可以对分组的结果进行汇总,如:

 

A

1

=demo.query("select * from EMPLOYEE")

2

=A1.group(DEPT)

3

=A2.new(DEPT,count(~):Count,~.sum(SALARY):TotalSalary)

4

=A2.new(DEPT,~.count(GENDER=="M"):Male, ~.count(GENDER=="F"):Female)

利用分组后的结果,A3中计算出各个部门的总人数和总薪水,A4计算出各个部门中男员工和女员工的总数。分组汇总的结果将会返回为序表,A3A4中的结果如下:

 

可以看到,在A3A4中,对A2中的同一分组进行了不同的汇总计算。分组结果可以重复利用,这是集算器的主要特点之一。

再解说一下A3中的表达式:=A2.new(DEPT,count(~):Count,~.sum(SALARY):TotalSalary),由于A2是序表A1的分组结果,其每个成员都是一个记录的集合,即排列,因此new函数对A2进行循环时,其内部表达式都是对排列进行操作的。比如DEPT表示取当前成员的第一条记录的部门字段的值;~.sum(SALARY)表示对当前排列的SALARY字段求和。

SQL中的group by类似,group函数也支持同时对多个字段(表达式)分组,此时只有多个字段的值均相等才会分到同一组。

 

有时候,需要把数据按指定数量分为多组,此时可以使用z(i,n) 函数。如:

 

A

1

=z(123,40)

2

=demo.query("select * from EMPLOYEE")

3

=A2.group(z(#,60))

4

=A3.new(#:GID,~.count():Count,~:Emps)

其中,z(i,n) 函数用来计算如果每n个分为一组,那么第i个成员分在第几组。A1中表达式即用来计算,如果40个一组的话,第123个成员分在第几组,结果如下:

A3中,则利用z函数,将员工数据按照每60个一组来分组,在A4中统计出了每一组的员工总数,计算后,A4中结果如下: