groups()

阅读(664) 标签: groups,

本章介绍groups()函数的多种用法。

A.groups()

描述:

采用累计方式对序表分组聚合计算。

语法:

A.groups(x:F,…;y:G,…)

备注:

将序表按照一个或多个字段/表达式分组聚合后,形成以F,... G,…为字段的新序表。对A的成员遍历,依次向对应结果集累计计算,相比先分组再聚合的方式,性能更优。

选项:

@o

只和相邻的对比,相当于归并,结果集不再排序

@n

x取值为分组序号,可直接定位,与@o互斥

@u

结果集不再按x排序;与@o/@n互斥

@i

xbool表达式,如果x的结果为true则开始新的一组。此时只有一个x

@m

数据量大的复杂运算中并行计算提升性能,计算次序不确定,与@oi互斥。

@0

使x的计算结果为空的组丢弃

@h

用于分段有序的数据,可提高分组效率

@t

A的返回值为空,则返回一个保留数据结构的空序表

参数:

A

序列

x

分组表达式

F

结果序表的字段名

G

结果序表中的汇总字段名

y

yA的函数。当y为聚合函数时:仅支持sum/count/max/min/top/avg/iterate

/icount/median,使用iterate(x,a;Gi,…)时不能有参数Gi。当y为非聚合函数时:只对每组第1条计算。

 

返回值:

分组后的序表

示例:

 

A

 

1

=demo.query("select * from SCORES where CLASS = 'Class one'")

2

=A1.groups(STUDENTID:StudentID;sum(SCORE):TotalScore)

单字段分组

3

=demo.query("select * from SCORES")

 

4

=A3.groups(CLASS:Class,STUDENTID:StudentID;sum(SCORE):TotalScore)

多字段分组

5

=A3.groups@m(STUDENTID:StudentID;sum(SCORE):TotalScore)

数据量大时提升性能

6

=A3.groups@o(STUDENTID:StudentID;sum(SCORE):TotalScore)

只和相邻的对比归并,结果集不排序

7

=demo.query("select * from STOCKRECORDS where STOCKID<'002242'")

 

8

=A7.groups@n(if(STOCKID=="000062",1,2):StockID;sum(CLOSING):TotalPrice)

x取值为分组序号

9

=demo.query("select * from EMPLOYEE")

 

10

=A9.groups@u(STATE:State;count(STATE):TotalScore)

结果集不按分组字段排序

11

=A9.groups@i(STATE=="California":IsCalifornia;count(STATE):count)

遇到STATE=="California"则开始新的分组

12

=A3.groups(CLASS:Class,STUDENTID:StudentID;iterate(~~*2,10): Score1)

分组的每组内进行iterate运算

13

=file("D:\\Salesman.txt").import@t()

14

=A13.groups@0(Gender:Gender;sum(Age):Total)

Gender为空的组丢弃

15

=file("D:/emp10.txt").import@t()

数据文件emp10.txt中,每10条数据根据DEPT进行了一次排序

16

=A15.groups@h(DEPT:dept;sum(SALARY):bouns)

A15是以DEPT分段有序的数据,使用@h选项提高分组效率

17

=A4.groups(STUDENTID:StudentID;SUBJECT,sum(SCORE):SUMSCORE)

非聚合函数计算第一条数据,English

18

=demo.query("select * from SCORES where CLASS = 'Class three'")

返回空序表

19

=A18.groups@t(STUDENTID:StudentID;sum(SCORE):TotalScore)

返回保留数据结构的空序表

注意:

A.groups(x:F,…;y:G,…)A.group(x:F,…;y:G,…)的区别:A.groups(x:F,…;y:G,…)是用累计方式计算,性能更好。

相关概念:

A.group(xi,…)

A.group(x:F,…;y:G,…)

ch.groups()

描述:

针对管道中的记录分组。

语法:

ch.groups(x:F,…;y:G…;n)

备注:

针对管道ch中的记录按照x分组并排序,形成以F,...G,…为字段的管道。

新管道中按分组字段x排序;新管道按分组表达式x排序,G字段值为对每一组执行聚合函数y后的结果。ych的聚合函数。该函数为结果集函数。

选项:

@n

x取值为分组序号,可直接定位

@u

结果集不再按x排序;与@n互斥

参数:

ch

管道

x

分组表达式,x:F省略表示针对全集聚合,此时不可省略。

F

结果序表的字段名

y

聚合函数,仅支持sum/count/max/min/top /avg/iterate,使用iterate(x,a;Gi,…)时不能有参数Gi

G

结果序表中的汇总字段名

返回值:

管道

示例:

 

A

 

1

=demo.cursor("select * from EMPLOYEE ")

 

2

=channel()

创建管道

3

=channel()

创建管道

4

=channel()

创建管道

5

=channel()

创建管道

6

=A1.push(A2,A3,A4,A5)

将游标A1中的数据推送到管道A2A3A4A5,此时数据不会立即被推送到管道。

7

=A2.groups(;sum(SALARY):TotalSalary)

省略x:F求所有员工的总工资

8

=A3.groups(DEPT:dept;sum(SALARY):TotalSalary)

指定字段DEPT分组,并按照指定字段排序

9

=A4.groups@n(if(GENDER=="F",1,2):SubGroups;sum(SALARY):TotalSalary)

x取值为分组序号,GENDER等于“F”的分到第一组,否则分到第二组,并且每个组聚合

10

=A5.groups@u(STATE:State;count(STATE):count)

结果集不按分组字段排序

11

= A1.select(month(BIRTHDAY)==2)

 

12

=A11.fetch()

游标A11添加了计算。

13

=A2.result()

14

=A3.result()

15

=A4.result()

16

=A5.result()

cs.groups()

描述:

针对集群游标中的记录分组。

语法:

cs.groups(x:F,…;y:G…;n)

备注:

针对集群游标中的记录分组。按分组字段排序,依次向结果集聚合。

按照x分组后,形成以F,...G,…为字段的新序表;新序表按分组表达式x排序,G字段值为对每一组执行聚合函数y后的结果。ycs的聚合函数。

选项:

@c

分机独立执行,结果集拼成集群内表,保持游标分布,可用作集群维表

@d

结果集复制到分机上拼成集群复写内表

参数:

cs

集群游标记录

x

分组表达式,x:F省略表示针对全集聚合,此时不可省略。

F

结果序表的字段名

y

聚合函数,仅支持sum/count/max/min/top/avg/iterate,使用iterate(x,a;Gi,…)时不能有参数Gi

G

结果序表中的汇总字段名

n

最大分组数,超过n时停止执行,用于分组数非常大时,防止内存溢出。并且最后的分组数不是确切数n,可能会比n大一些。

返回值:

序表或集群内表

示例:

 

A

 

1

=file("D:/emp1.ctx","192.168.0.111:8281")

emp1.ctx数据文件内容如下:

2

=A1.create()

打开集群组表

3

=A2.cursor()

返回集群游标

4

=A3.groups(Dept:dept;count(Name):count)

根据DEPT分组,然后聚合

  

 

 

A

 

1

[192.168.0.110:8281,192.168.18.143:8281]

 

2

=file("emp.ctx", A1)

 

3

=A2.create()

打开集群组表

4

=A3.cursor()

获取集群游标

5

=A4.groups(GENDER:gender;sum(SALARY):totalSalary)

根据GENDER分组后再聚合,返回序表

6

=A3.cursor()

 

7

=A6.groups@c(GENDER:gender;sum(SALARY):totalSalary).dup()

游标保持分布,返回集群内表

8

=A3.cursor()

 

9

=A8.groups@d(GENDER:gender;sum(SALARY):totalSalary).dup()

结果集复制到分机上拼成集群复写内表

cs.groups()

描述:

针对游标中的记录分组。

语法:

cs.groups(x:F,…;y:G…;n)

备注:

针对游标中的记录分组。按分组字段排序,依次向结果集聚合。

按照x分组后,形成以F,...G,…为字段的新序表;新序表按分组表达式x排序,G字段值为对每一组执行聚合函数y后的结果。ycs的聚合函数。

选项:

@n

x取值为分组序号,可直接定位,n为事先设定的总组数,可以直接先生成空间

@u

结果集不再按x排序;与@n互斥

@o

只和相邻的对比,相当于归并,结果集不再排序

 

@i

xbool表达式,如果x的结果为true则开始新的一组。此时只有一个x

 

@h

用于分段有序的数据,可提高分组效率

 

参数:

cs

游标记录或集群游标记录

x

分组表达式,x:F省略表示针对全集聚合,此时不可省略。

F

结果序表的字段名

y

聚合函数,仅支持sum/count/max/min/top/avg/iterate,使用iterate(x,a;Gi,…)时不能有参数Gi

G

结果序表中的汇总字段名

n

最大分组数,超过n时停止执行,用于分组数非常大时,防止内存溢出。并且最后的分组数不是确切数n,可能会比n大一些。没有n的情况下支持多路游标。不支持选项@n

返回值:

分组后的序表

示例:

 

A

 

1

=demo.cursor("select * from SCORES where CLASS = 'Class one'")

 

2

=A1.groups(;sum(SCORE):TotalScore)

省略x:F求所有学生的总成绩

3

=demo.cursor("select * from FAMILY")

 

4

=A3.groups(GENDER:gender;sum(AGE):TotalAge)

指定字段分组,并按照指定字段排序

5

=demo.cursor("select * from STOCKRECORDS where STOCKID<'002242'")

 

6

=A5.groups@n(if(STOCKID=="000062",1,2):SubGroups;sum(CLOSING):ClosingPrice)

x取值为分组序号,STOCKID等于000062的分到第一组,否则分到第二组,并且每个组聚合

7

=demo.cursor("select * from EMPLOYEE")

 

8

=A7.groups@u(STATE:State;count(STATE):Total)

结果集不按分组字段排序

9

=demo.cursor("select * from EMPLOYEE")

 

10

=A9.groups@o(STATE:State;count(STATE):Total)

只和相邻的对比,结果不排序

11

=demo.cursor("select * from EMPLOYEE")

 

12

=A11.groups@i(STATE=="California":IsCalifornia;count(STATE):count)

遇到STATE=="California"则开始新的分组

13

=file("D:/emp10.txt").cursor@t()

数据文件emp10.txt中,每10条数据根据DEPT进行了一次排序

14

=A13.groups@h(DEPT:DEPT;sum(SALARY):bouns)

A13是以DEPT分段有序的数据,使用@h选项提高分组效率

15

=demo.query("select  * from employee")

 

16

=A15.cursor@m(3)

返回多路游标

17

=A16.groups(STATE:state;sum(SALARY):salary)

多路游标使用groups并行分组