在上面的例子中,在对齐时,每个州中只获得了满足条件的第1条数据。在很多情况下,我们需要找出对应的所有数据,此时可以用align@a进行对齐分组,如:
|
A |
B |
1 |
=demo.query("select EID,NAME,GENDER, STATE,DEPT from EMPLOYEE") |
[California,Texas,Florida,Illinois] |
2 |
=A1.align@a(B1,STATE) |
|
3 |
=A2.new(STATE,~.count(GENDER=="M"):Male,~.count(GENDER=="F"):Female) |
|
4 |
=A1.align@n(B1,STATE) |
|
A2在align函数中添加了@a选项,在对齐时,对应每个州将找到所有对应的记录:
对齐分组后的返回值是由各个分组构成的序列,A2中的结果是个由序列构成的序列。和用group分组类似,align@a对齐分组后的结果,也经常用来进一步计算。如A3中,根据分组结果,进一步汇总计算出每州男员工和女员工的总数:
在对齐分组时,可能有一些数据,无法与基准序列中的任何一个成员对应。集算器提供了另一种模式的对齐分组选项align@n,在这种模式下,所有无法对应的成员,将被划分到一个新组中。如A4中的分组结果如下:
比较A2和A4中对齐分组的结果,我们可以发现,A4中多出了一个分组,存储了指定的4个州之外的员工记录。
在对齐分组时,基准序列也可以由计算获得,如:
|
A |
1 |
=demo.query("select EID,NAME,GENDER, STATE,DEPT from EMPLOYEE") |
2 |
=A1.groups(STATE;count(~):Count) |
3 |
=A2.sort(-Count) |
4 |
=A1.align@a(A3:STATE,STATE) |
在A2中,用groups分组汇总计算出各个州的员工总数,并在A3中将结果按员工总数降序排序。A2和A3中的结果如下:
A4在对齐分组时,从A3的排序结果中获得州数据,计算出对齐时的基准序列。结果如下:
在对齐分组时,还有一种方式是用P.align(n,y),直接划分为n个组,并根据分组表达式y直接计算出每个成员对应的组号,如:
|
A |
1 |
=demo.query("select EID,NAME,GENDER, STATE,DEPT from EMPLOYEE") |
2 |
=A1.align@a(26,asc(left(NAME,1))-64) |
3 |
[HR,R&D,Finance,Marketing] |
4 |
=A1.align@a(A3.len(),A3.pos(DEPT)) |
在A2的表达式 =A1.align@a(26,asc(left(NAME,1))-64) 中,left(NAME,1) 取出员工名的首字母,再用asc函数转为ASCII码,减去64后就将各个大写字母对应到1~26的组号中。对齐分组后,结果如下:
分组后,同一组内的员工,姓名的首字母相同。
在使用P.align(n,y)方式时,有时也用定位函数,如pos,pmax等函数来计算组号,A4中将员工按照指定的部门序列对齐分组,结果如下:
在用group将数据分组时,各个组会按照分组值升序排序,而使用对齐分组,就能指定顺序。