6.21 分组子集:对子集再用聚合值过滤

 

严格来说,分组和汇总是两个独立的动作,但在 SQL 中总是一起出现,从而给人一种两者必须同时使用的假象。事实上,这种组合是对分组操作的一种局限,或者说分组之后,能够进行的计算远不止 SQL 中的几种聚合函数。

ID NAME BIRTHDAY STATE DEPT SALARY
1 Rebecca 1974/11/20 California R&D 7000
2 Ashley 1980/07/19 New York Finance 11000
3 Rachel 1970/12/17 New Mexico Sales 9000
4 Emily 1985/03/07 Texas HR 7000
5 Ashley 1975/05/13 Texas R&D 16000

查询年龄低于部门平均年龄的员工。
可以在函数 A.group() 中,定义分组后对每个分组子集的运算。不限于 SUM、COUNT 等聚合运算,可以定义一些复杂运算。
脚本:

A
1 =T(“Employee.csv”)
2 =A1.group(DEPT; (a=~.avg(age(BIRTHDAY)), ~.select(age(BIRTHDAY)<a)):YOUNG)
3 =A2.conj(YOUNG)

A1 导入员工表。
A2 按部门分组,并在每个分组中选出年龄低于平均年龄的记录。在函数 A.group() 的聚合运算中,我们可以使用临时变量,使得运算更加简单易懂。
A3 将选出的记录合并。