本章介绍group()函数的多种用法。
描述:
按xi,…做等值分组
语法:
A.group(xi,…)
备注:
将序列/排列按照一个或多个字段/表达式进行等值分组,结果为组集构成的序列
选项:
@o |
只和相邻的对比,相当于归并,结果集不再排序 |
@1 |
取每一个分组的第一条记录组成排列后返回(注意是数字1,不是字母l) |
@n |
x取值为分组序号,可直接定位,与@o互斥 |
@u |
结果集不再按x排序;与@o/@n互斥 |
@i |
x是bool表达式,如果x的结果为true则开始新的一组。相当于A.group@o(a+=if(x,1,0)) ,a=0且只有一个x。 |
@0 |
使x的计算结果为空的组丢弃,当只有一个x时可以用该选项 |
@s |
分组后序列/排列进行和列,相当于A.group(xi,…).conj() |
@p |
返回组成员在A中位置构成的数列的序列 |
@h |
用于分段有序的数据,可提高分组效率 |
参数:
A |
序列 |
xi |
分组表达式,多个字段/表达式组合分组时,每个分组表达式用逗号隔开 |
返回值:
序列/排列
示例:
Ø 对数列分组
|
A |
|
1 |
[6,9,12,15,16,5,1,7,8] |
[[6,12,16,8],[ 9,15,5,1,7]]数列被分为2组,一组成员除以2余数为0,另一组成员除以2余数为1 |
2 |
=A1.group(~%2) |
|
3 |
=A1.group(~%2,~%3) |
[[6,12],[16],[8],[9,15],[1,7],[5]] 按照多个表达式分组。 |
4 |
=[6,9,16,5,1,7,8].group@s(~%2) |
按照奇偶数分组后和列 |
Ø 对分组结果重复利用
|
A |
|
1 |
=demo.query("select NAME,BIRTHDAY,GENDER from EMPLOYEE") |
|
2 |
=A1.group(GENDER) |
[[Rebecca,Ashley,Rachel,…],[Matthew,Ryan,Jacob,…]],点开分组后每个成员就是一个序列 |
3 |
=A2.new(GENDER:Gender,~.count():Number) |
对分组后的成员进行统计 |
4 |
=A2.new(GENDER:Gender,~.avg(age(BIRTHDAY)):Average) |
对分组结果重复利用,再次进行不同的统计 |
Ø 多种分组方式
|
A |
|
1 |
=demo.query("select NAME,GENDER,DEPT,BIRTHDAY from EMPLOYEE") |
|
2 |
=A1.group(GENDER,DEPT) |
多字段分组 |
3 |
=A1.group@o(GENDER) |
不排序,相邻的记录进行比较,相同的归为一组。不相邻但相同的记录可能变成两组,因此会出现重复的组,返回序列集, |
4 |
=A1.group@1(GENDER) |
返回每组第一条记录
|
5 |
=A1.group@n(if(GENDER=="F",1,2)) |
x取值为分组序号,可直接定位 [[Rebecca,Ashley,Rachel,…],[Matthew,Ryan,Jacob,…]] |
6 |
=A1.group@u(GENDER,DEPT) |
结果集不按分组字段排序 |
7 |
=A1.group@i(GENDER=="F") |
遇到GENDER=="F"则开始新的分组 |
8 |
=A1.group@p(GENDER,DEPT) |
返回按照字段GENDER,DEPT分组后,记录在原序表中的位置构成的序列 |
9 |
=file("D:\\Salesman.txt").import@t() |
|
10 |
=A9.group@0(Gender) |
按照字段Gender分组,为空的组丢弃不显示 |
11 |
=file("D:/emp10.txt").import@t() |
数据文件emp10.txt中,每10条数据根据DEPT进行了一次排序 |
12 |
=A11.group@h(DEPT) |
A11是以DEPT分段有序的数据,使用@h选项提高分组效率 |
相关概念:
描述:
对序列先分组再聚合
语法:
A.group(x:F,...;y:G,…)
备注:
将序列按照一个或多个字段/表达式先进行分组,然后再进行聚合运算。按照x分组后,形成以F,... G,…为字段的新序表。F字段值为每一组第一条记录的x字段值,G字段值为对每一组进行y操作后的结果。
选项:
@o |
只和相邻的对比,相当于归并,结果集不再排序 |
@n |
x取值为分组序号,可直接定位,与@o互斥 |
@u |
结果集不再按x排序;与@o/@n互斥 |
@i |
x是bool表达式,如果x的结果为true则开始新的一组。此时只有一个x。 |
@0 |
使x的计算结果为空的组丢弃 |
@h |
用于分段有序的数据,可提高分组效率 |
参数:
A |
序列 |
x |
分组表达式,x:F省略则不分组针对全集聚合,此时;不可省略 |
F |
结果序表的字段名 |
G |
结果序表中的汇总字段名 |
y |
聚合表达式,用~引用组 |
返回值:
序列
示例:
|
A |
|
1 |
=demo.query("select * from SCORES") |
|
2 |
=A1.group(STUDENTID:StudentID;~.sum(SCORE):TotalScore) |
|
3 |
=A1.group@o(STUDENTID:StudentID;~.sum(SCORE):TotalScore) |
只和相邻的对比归并,结果集不排序 |
4 |
=demo.query("select * from STOCKRECORDS where STOCKID<'002242'") |
|
5 |
=A4.group@n(if(STOCKID=="000062",1,2):StockID;~.sum(CLOSING):TotalPrice) |
x取值为分组序号 |
6 |
=A1.group(;~.sum(SCORE):TotalScore) |
省略x:F求所有学生的总成绩 |
7 |
=demo.query("select * from EMPLOYEE") |
|
8 |
=A7.group@u(STATE:State;~.count(STATE):TotalScore) |
结果集不按分组字段排序 |
9 |
=A7.group@i((GENDER=="F"):IsF;~.count():Number) |
遇到GENDER=="F"则开始新的分组 |
10 |
=file("D:\\Salesman.txt").import@t() |
|
11 |
=A10.group@0(Gender:Gender;~.sum(Age):Total) |
Gender为空的组丢弃 |
12 |
=file("D:/emp10.txt").import@t() |
数据文件emp10.txt中,每10条数据根据DEPT进行了一次排序 |
13 |
=A12.group@h(DEPT:dept;~.sum(SALARY):bouns) |
A12是以DEPT分段有序的数据,使用@h选项提高分组效率 |
相关概念:
描述:
针对管道记录做相邻值分组,返回管道
语法:
ch.group(x)
备注:
针对管道记录ch按照x分组,x只和相邻的对比,相当于归并,结果集不再排序,返回由序列构成的管道。
该函数属于附加计算动作。
选项:
@i |
x是bool表达式,如果x的结果为true则开始新的一组。此时只有一个x。 |
参数:
ch |
管道 |
x |
分组表达式,多个字段/表达式组合分组时,每个分组表达式用逗号隔开 |
返回值:
管道
示例:
|
A |
|
1 |
=demo.cursor("select EID,NAME,GENDER,DEPT,SALARY from EMPLOYEE") |
|
2 |
=channel() |
创建管道 |
3 |
=channel() |
创建管道 |
4 |
=A2.group(GENDER,DEPT) |
按照GENDER,DEPT进行分组 |
5 |
=A2.fetch() |
A2管道附加结果集函数ch.fetch(),保留管道当前数据 |
6 |
=A3.group@i(GENDER=="F") |
遇到GENDER=="F"则开始新的分组 |
7 |
=A3.fetch() |
A3管道附加结果集函数ch.fetch() |
8 |
=A1.push(A2,A3) |
将游标A1中的数据推送到管道A2和A3,此时数据不会立即被推送到管道。 |
9 |
=A1.skip() |
A1执行skip()时程序才会执行管道中的计算,游标中的数据才真正被推送到管道。 |
10 |
=A2.result() |
|
11 |
=A3.result() |
|
针对游标记录做相邻值分组,返回原游标
语法:
cs.group(x,…)
备注:
针对游标记录cs按照x分组,x只和相邻的对比,相当于归并,要求cs有序,返回由序列构成的原游标,支持多路游标。
选项:
@i |
x是bool表达式,如果x的结果为true则开始新的一组。此时只有一个x。 |
@1 |
取每一个分组的第一条记录组成排列后返回(注意是数字1,不是字母l) |
@q(x:F,…;x’:F’,…;…) |
cs已对x,…有序,仅后面的字段需要排序时可用该选项,可以内存排序。 |
@s |
仅排序,不分组,必须要与@q配合使用 |
参数:
cs |
游标记录 |
x |
分组表达式,多个字段/表达式组合分组时,每个分组表达式用逗号隔开 |
返回值:
原游标cs
示例:
|
A |
|
1 |
=demo.cursor("select * from EMPLOYEE") |
|
2 |
=A1.group(GENDER,DEPT) |
相邻记录中GENDER与DEPT字段值皆相同时,记录分到同一组中,结果返回原游标 |
3 |
=demo.cursor("select * from EMPLOYEE") |
|
4 |
=A3.group@i(GENDER=="F").fetch() |
遇到GENDER=="F"则开始新的分组 |
5 |
=demo.cursor("select * from EMPLOYEE order by GENDER ") |
|
6 |
=A5.group@1(GENDER).fetch() |
返回每组第一条记录 |
7 |
=demo.cursor("select * from EMPLOYEE order by DEPT ") |
查询EMPLOYEE表中的数据,根据DEPT排序,结果返回游标 |
8 |
=A7.group@q(DEPT;GENDER) |
A7中返回的游标已经对DEPT排序,所以分组时仅对GENDER进行组排序 |
9 |
=A7.group@qs(DEPT:DEPT;GENDER:GENDER).fetch() |
仅排序,不分组 |
相关概念:
描述:
针对集群游标记录做相邻值分组
语法:
cs.group(x,…)
备注:
针对集群游标记录cs按照x分组,x只和相邻的对比,相当于归并,要求cs有序,返回由序列构成的原集群游标,支持多路游标。
参数:
cs |
集群游标记录 |
x |
分组表达式,多个字段/表达式组合分组时,每个分组表达式用逗号隔开 |
返回值:
原集群游标
示例:
|
A |
|
1 |
=file@n("D:/employees.ctx","192.168.0.111:8281") |
employees.ctx文件对DEPT有序,数据内容如下: |
2 |
=A1.create() |
打开集群组表 |
3 |
=A2.cursor() |
返回集群游标 |
4 |
=A3.group(DEPT) |
将集群游标记录根据DEPT分组,结果返回原集群游标 |
5 |
=A4.fetch() |
|
描述:
对cs游标做相邻分组聚合,返回原游标
语法:
cs.group(x:F,...;y:G,…)
备注:
针对游标记录cs按照x分组,cs对x有序,x只和相邻的对比,然后再进行聚合运算,结果集不再排序。按照x分组后,形成以F,... G,…为字段的原游标。F字段值为每一组第一条记录的x字段值,G字段值为对每一组进行y操作后的结果,支持多路游标。
参数:
cs |
游标记录或集群游标记录 |
x |
分组表达式 |
F |
字段名 |
G |
汇总字段名 |
y |
聚合表达式 |
返回值:
原游标或原集群游标cs
示例:
|
A |
|
1 |
=demo.cursor("select * from SCORES where STUDENTID <5 order by STUDENTID ") |
按照SCORE排序 |
2 |
=A1.group(STUDENTID:StudentID;sum(SCORE):TotalScore) |
返回原游标cs |
3 |
=A2.fetch() |
|
|
A |
|
1 |
=file@n("D:/employees.ctx","192.168.0.111:8281") |
employees.ctx文件对DEPT有序,数据内容如下: |
2 |
=A1.create() |
打开集群组表 |
3 |
=A2.cursor() |
返回集群游标 |
4 |
=A3.group(DEPT:dept;count(NAME):count) |
根据DEPT进行相邻分组,然后进行聚合计算,结果返回原集群游标 |
5 |
=A4.fetch() |
|