6.1 基本概念
SQL
SELECT ShipVia,sum(Quantity) Quantity
FROM Orders2021
GROUP BY ShipVia
ORDER BY ShipVia
SELECT ProductID, sum(Amount) Amount
FROM Orders2021
GROUP BY ProductID
ORDER BY ProductID
SELECT EmployeeID,EmployeeName,sum(Amount) Amount
FROM Orders2021
GROUP BY EmployeeID,EmployeeName
ORDER BY EmployeeID,EmployeeName
SPL
本例需要针对相同的数据计算多种分组汇总,如果我们能够只遍历一次就完成多次计算,就可以减少外存访问量来提速。
大数据的分组汇总通常使用游标实现,在用游标遍历时,将读出的每一段数据分组汇总后累积到结果集上。有多种分组,也只要分别分组汇总后累积到各自的结果集上即可。这样,只要遍历一次,就可以得到多种分组结果了。
解法一:
A | B | |
---|---|---|
1 | =file(“Orders2021_Account.ctx”).open().cursor@x(ShipVia,ProductID,EmployeeID,EmployeeName, Quantity, Amount) | |
2 | cursor A1 | =A2.groups(ShipVia;sum(Quantity):Quantity) |
3 | cursor | =A3.groups(EmployeeID;EmployeeName,sum(Amount):Amount) |
4 | cursor | =A4.groups(ProductID; sum(Amount):Amount) |
A2 用 cursor 关键字定义游标 A1 同步的管道。B2 在管道 A2 设置了第 1 种方式的分组汇总
A3-A4 定义了两个管道
B3 在管道 A3 设置了第 2 种方式的分组汇总
B4 在管道 A4 设置了第 3 种方式的分组汇总。
解法二:
A | |
---|---|
1 | =file(“Orders2021_Account.ctx”).open().cursor@x(ShipVia,ProductID,EmployeeID,EmployeeName, Quantity, Amount) |
2 | >ch1=channel(A1).groups(ShipVia;sum(Quantity):Quantity) |
3 | >ch2=channel(A1).groups(EmployeeID;EmployeeName, sum(Amount):Amount) |
4 | =A1.groups(ProductID; sum(Amount):Amount) |
5 | =ch1.result() |
6 | =ch2.result() |
A2-A3 定义管道,及管道上的分组汇总
A4 对游标执行分组计算。
A5-A6 获得管道的运算结果
以上两种解法取其一即可,没有本质上的区别。如果有大分组结果集,必须返回游标,无法把结果集放到内存的情况,则只能采用 channel 的写法,把大分组结果集的计算放到游标上,其它小结果集计算放到管道上。