7.3.2多个游标的聚合运算

当处理多个游标的聚合运算时,可以先算出每个游标聚合运算的结果:

 

A

1

=file("Order_Wines.txt")

2

=file("Order_Electronics.txt")

3

=file("Order_Foods.txt")

4

=file("Order_Books.txt")

5

=[A1:A4].(~.cursor@t())

6

=A5.(~.groups(Date;count(~):Count,sum(round(decimal(Amount),2)):TotalAmount))

A6中,对各个文件游标分别分组聚合,计算出每类商品每天的聚合统计结果,如下:

由于在使用cs.groups() 函数对游标分组聚合时,会根据分组值排序,所以对每类商品分组聚合后,无论原始数据的顺序如何,结果序表都是对时间有序的。这样,就可以进一步将结果归并,计算出所有商品每天的订单数据:

 

A

1

=file("Order_Wines.txt")

2

=file("Order_Electronics.txt")

3

=file("Order_Foods.txt")

4

=file("Order_Books.txt")

5

=[A1:A4].(~.cursor@t())

6

=A5.(~.groups(Date;count(~):Count,sum(round(decimal(Amount),2)):TotalAmount))

7

=A6.merge(Date)

8

=A7.groups(Date;sum(Count):Count,sum(round(decimal(TotalAmount),2)):TotalAmount)

A8中的汇总结果如下:

 

由于在各个数据文件中,每类商品的订单已经按日期排序,因此也可以先将游标有序归并再聚合运算:

 

A

1

=file("Order_Wines.txt")

2

=file("Order_Electronics.txt")

3

=file("Order_Foods.txt")

4

=file("Order_Books.txt")

5

=[A1:A4].(~.cursor@t())

6

=A5.mergex(Date)

7

=A6.groups(Date;count(~):Count,sum(round(decimal(Amount),2)):TotalAmount)

可以看到,这种方法与上面的结果是相同的。对于多个数据有序的游标,先归并再分组聚合要更简便,计算效率也更高。值得注意的是,mergemergex的区别:A.merge() 是将多个序列中的成员或多个序表中的记录有序归并,将返回序列,在执行时就计算完毕;CS.mergex() 是将多个游标中的记录有序归并,将返回游标,在游标取数时才会真正计算。而在使用时,ACS中的数据均要求有序。关于mergex的使用,在7.4游标归并与连接中有更详细的说明。