news()

阅读(3966) 标签: news,

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

A.news( X;xi:Fi,… )

描述:

针对序列的每个成员,按照指定条件生成多条记录,合并组成新的序表。

语法:

A.news(X;xi:Fi,…)

备注:

针对序列A的每个成员,与序列/整数X经过计算表达式xi后生成多条记录,合并组成新的序表。

参数:

A

序列。

X

序列/整数;X为整数时 可理解为to(X)相当于对A计算了X次。

xi

表达式,结果为字段值,xi中的~针对X而非A

Fi

结果序表的字段名,缺省为xi,当xi#i时使用原列名。

选项:

@1

左连接,当X为空时创建一条空记录。注意是数字1

@m

并行计算提升性能。

@q

只有一个xi且无F参数,当xi计算结果是序列时,返回成序列的序列。

返回值:

序表

示例:

A为序列:

 

A

 

1

[1,2,3,4,5]

 

2

=A1.news([10,20]; A1.~:a,~:b,a*b)

X为序列时,对AX的成员逐一进行计算,将A1的成员作为字段a的值,[10,20]的成员作为字段b的值,第3列为a*b的结果值, Fi缺省直接参数xi用作为字段名:

3

=A1.news(2; A1.~:a, ~:b,a*b)

X为整数时,相当于to(2),依次对A1的成员计算2次:

A为序表:

 

A

 

1

=demo.query("select top 5 ID,NAME,BIRTHDAY,DEPT,SALARY from EMPLOYEE")

2

=A1.news(~;NAME,age(BIRTHDAY):AGE)

X为序表,~理解为A1,计算A1序表,返回的记录中含有字段NAMEAGEAGE是根据A1的字段BIRTHDAY计算而来:

3

=A1.news(3;EID,NAME,SALARY*~:Salary)

X为整数3,对A1的成员分别计算三次,其中~可理解为当前计算次数:

A为排列:

 

A

 

1

=demo.query("select top 10 EID,NAME,DEPT,GENDER,SALARY from EMPLOYEE")

2

=A1.group(DEPT).(~.group(GENDER))

A1序表根据DEPT分组,然后再继续根据GENDER分组:

3

=A2.news(~;A2.~.DEPT,A2.~.~.GENDER,A2.~.~.avg(SALARY):AvgSalary)

取出A2分组中的DEPTGENDER值,计算各个DEPTGENDER的平均工资:

参数xi中用#i

 

A

 

1

=demo.query("select  top 10  EID,NAME,BIRTHDAY,GENDER,SALARY from EMPLOYEE")

2

=A1.group(GENDER;~:GenderGroup,~.avg(SALARY):Avg)

A1根据GENDER做分组,并计算每组平均工资:

3

=A2.news(GenderGroup;EID,#2,GENDER, age(~.BIRTHDAY):age,SALARY+1000:Nsalary,A2.Avg:AvgSalary)

针对A2每组计算表达式,生成记录合并成一个新序表,其中#2表示GenderGroup中的第2个字段,即NAME

使用@1选项,左连接:

 

A

 

1

=demo.query("select top 5 EID,NAME,BIRTHDAY,GENDER,SALARY from EMPLOYEE")

2

=A1.group(GENDER;~:GenderGroup)

A1根据GENDER对记录做分组:

3

=demo.query("select top 10 EID,NAME,BIRTHDAY,GENDER,SALARY from EMPLOYEE")

4

=A3.group(GENDER;avg(SALARY):avg)

A3根据GENDER分组,计算每组的平均工资:

5

=A4.join(GENDER,A2:GENDER,GenderGroup)

A2A4根据GENDER字段连接,由于A2中没有GENDERM的对应数据,所以表连接后,对应的GenderGroup字段值为null

6

=A5.news(GenderGroup;EID,NAME,GENDER,age(~.BIRTHDAY):age,avg:AvgSalary)

对排列A5计算表达式后生成的记录,默认丢弃GenderGroup为空的记录:

7

=A5.news@1(GenderGroup;EID,NAME,GENDER,age(~.BIRTHDAY):age,avg:AvgSalary)

使用@1参数,当排列X为空时,创建一条空记录:

  使用@q选项,返回序列的序列:

 

A

 

1

=file("emp.txt").cursor@w().fetch()

返回内容:

2

=A1.news@q(2;[A1.~(2),A1.~(3)*~])

使用@q选项,只有一个xi参数无F参数且xi计算结果为序列,结果返回序列的序列:

 

相关概念:

cs.news()

ch.news()

描述:

排列按照指定条件生成多条记录,合并组成新序表返回到原管道中。

语法:

ch.news(X;xi:Fi,…)

备注:

管道ch附加计算,排列X计算xi后生成多条记录形成新序表返回到原管道中。xi作为新字段Fi的值。

该函数属于附加计算动作

参数:

ch

管道。

X

排列。

xi

表达式,结果为字段值,xi中的~针对X而非ch。用#时表示用序号定位。

Fi

ch的字段名,省略则自动识别。

选项:

@1

左连接,当排列X为空时,则创建一条空记录。

返回值:

管道

示例:

 

A

 

1

=demo.cursor("select EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE")

返回游标。

2

=demo.query("select EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE")

返回序表:

3

=A2.group(GENDER;~:gup)

根据GENDER字段对A2序表分组,返回结果如下:

4

=A1.groupx(GENDER;avg(SALARY):avg)

根据GENEDER字段对A1分组,汇总每组的SALARY平均值,返回游标,数据内容如下:

5

=A4.join(GENDER,A3:GENDER,gup)

A4游标附加计算,与A3外键式连接,返回A4游标,A4执行A5计算后数据内容如下:

6

=channel(A5)

创建管道并将游标A5中的数据推送至管道,此时数据不会立即被推送到管道。

7

=A6.news(gup;EID,#2:Lname,GENDER,age(~.BIRTHDAY):Age,SALARY+50: Salary,avg:AvgSalary)

管道A6附加计算,计算gup的字段值,#2Lname表示将gup中的第2个字段重命名为Lname,将 EID, Lname,GENDER, Age, Salary, AvgSalary字段组成的序表返回到原管道A6

8

=A6.fetch()

管道A6执行结果集函数,保留管道当前数据。

9

=A5.fetch()

A5游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。

10

=A6.result()

获取管道计算结果:

使用@1选项:

 

A

 

1

=demo.cursor("select EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE")

返回游标。

2

=demo.query("select EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE where GENDER='M' ")

返回序表:

3

=A2.group(GENDER;~:gup)

根据GENDER字段对A2序表分组,返回结果如下:

4

=A1.groupx(GENDER;avg(SALARY):avg)

根据GENEDER字段对A1分组,汇总每组的SALARY平均值,返回游标,数据内容如下:

5

=A4.join(GENDER,A3:GENDER,gup)

A4游标附加计算,与A3外键式连接,返回A4游标,A4执行A5计算后数据内容如下:

6

=channel(A5)

创建管道并将游标A5中的数据推送至管道,此时数据不会立即被推送到管道。

7

=A6.news@1(gup;EID,NAME,GENDER,age(~.BIRTHDAY):Age,Salary,avg:AvgSalary)

管道A6附加计算,计算gup的字段值,#2Lname表示将gup中的第2个字段重命名为Lname,将 EID, Lname,GENDER, Age, Salary, AvgSalary字段组成的序表返回到原管道A6

使用@1选项,左连接,当排列X为空时,则创建一条空记录。

8

=A6.fetch()

管道A6执行结果集函数,保留管道当前数据。

9

=A5.fetch()

A5游标执行取数动作,此时数据才会被推送到管道,然后管道执行计算并记录结果。

10

=A6.result()

获取管道计算结果:

cs.news()

描述:

排列按照指定条件生成多条记录,合并组成新序表返回到原游标中。

语法:

cs.news(X;xi:Fi,…)

备注:

游标cs附加计算,排列X计算xi后生成多条记录形成新序表返回到原游标cs中。xi作为新字段Fi的值

该函数属于延迟计算函数。

参数:

cs

游标。

X

排列。

xi

表达式,结果为字段值,xi中的~针对X而非cs。用#时表示用序号定位。

Fi

cs的字段名,省略则自动识别。

选项:

@1

左连接,当排列X为空时,则创建一条空记录。

返回值:

游标

示例:

 

A

 

1

=demo.cursor("select EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE")

返回游标。

 

2

=demo.query("select EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE")

返回序表:

3

=A2.group(GENDER;~:gup)

根据GENDER字段对A2序表分组,返回结果如下:

4

=A1.groupx(GENDER;avg(SALARY):avg)

根据GENEDER字段对A1分组,汇总每组的SALARY平均值,返回游标,数据内容如下:

5

=A4.join(GENDER,A3:GENDER,gup)

A4游标附加计算,与A3外键式连接,返回A4游标,A4执行A5计算后数据内容如下:

6

=A4.news(gup;EID,#2:Lname,GENDER,age(~.BIRTHDAY):Age,SALARY+50: Salary,avg:AvgSalary)

A4游标附加计算,计算gup的字段值,#2Lname表示将gup中的第2个字段重命名为Lname,将 EID, Lname,GENDER, Age, Salary, AvgSalary字段组成的序表返回到游标A4中,返回A4游标。

7

=A4.fetch()

A4游标执行A6计算后,读取数据内容如下(数据量较大时建议分批读取):

使用@1选项:

 

A

 

1

=demo.cursor("select  EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE")

返回游标。

 

2

=demo.query("select EID,NAME,DEPT,GENDER,BIRTHDAY,SALARY from EMPLOYEE where GENDER='M' ")

返回序表:

3

=A2.group(GENDER;~:gup)

根据GENDER字段对A2序表分组,返回结果如下:

4

=A1.groupx(GENDER;avg(SALARY):avg)

根据GENEDER字段对A1分组,汇总每组的SALARY平均值,返回游标,数据内容如下:

5

=A4.join(GENDER,A3:GENDER,gup)

A4游标附加计算,与A3外键式连接,返回A4游标,A4执行计算后数据内容如下:

6

=A4.news@1(gup;EID,NAME,GENDER,age(~.BIRTHDAY):Age,Salary,avg:AvgSalary)

A4游标附加计算,计算gup的字段值,将 EID, NAME,GENDER, Age, Salary, AvgSalary字段组成的序表返回到游标A4中,返回A4游标。使用@1选项,左连接,当排列X为空时,则创建一条空记录

7

=A4.fetch()

A4游标执行A6计算后,读取数据内容如下:

 

相关概念:

A.news(X;xi:Fi,)

 

T.news(A/cs:K…,x:C,...;wi)

描述:

根据序表/游标的键与组表的字段对应,返回由指定字段组成的序表/游标。

语法:

T.news(A/cs:K…,x:C,…;wi)

备注:

组表T为子表,序表A/游标cs为主表,TA/ cs是多对一的关系,按A/cs的键(/)字段与T(从头开始)的字段对应,返回由x:C组成的序表/游标。要求A/cs对键(/)有序,且A/cs的键(/)T前面字段同序。

参数为A时返回序表,为cs时返回游标/多路游标。

返回结果集向T对齐并设置维/键,复制主表记录。

参数:

T

组表。

A/cs

序表/游标/组表游标。

K

A/cs字段,有K时用KT前面字段对应,K缺省用A/cs(/)多个K时用 : 隔开。

x

字段名/聚合函数,支持count/sum/max/min/avg

C

列别名。

wi

T的过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。除常规的过滤表达式外,过滤条件中还支持如下几种写法,其中K表示实表T中的非键字段:

1K=w

w通常使用表达式Ti.find(K)Ti.pfind(K)Ti为序表,wnullfalse时将被过滤掉;当w为表达式Ti.find(K)且被选出字段C,...中包含K时,K将被赋值为Ti的指引字段; w为表达式Ti.pfind(K)且被选出字段C,...中包含K时,K将被赋值为KTi 中的序号。

2(K1=w1,Ki=wi,w)

Ki=wi为赋值表达式,参数wi通常可以使用表达式Ti.find(Ki)Ti.pfind(K)Ti为序表;当wi为表达式Ti.find(Ki)且被选出字段C,...中包含Ki时。Ki将被赋值为Ti的指引字段; wi为表达式Ti.pfind(Ki)且被选出字段C,...中包含Ki时,Ki将被赋值为KiTi 中的序号。

w为过滤表达式, w中可引用Ki

3K:Ti

Ti为序表,用实表中Ki的值与Ti的键值作对比,匹配不上的将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。

4K:Ti:null

符合K:Ti的记录将被过滤掉。

选项:

@r

聚合子表数据,返回结果集向A/cs对齐。

返回值:

序表/游标

示例:

 

A

 

1

=connect("demo").cursor("SELECT STUDENTID,CLASS,SUBJECT,SCORE FROM SCORES")

返回游标。

2

=file("scores-news.ctx")

 

3

=A2.create@y(#STUDENTID,#CLASS,SUBJECT,SCORE)

创建组表,STUDENTIDCLASS为组表的维。

4

=A3.append@i(A1)

5

=connect("demo").query("SELECT ID,NAME,GENDER,AGE FROM STUDENTS")

返回序表

6

=A4.news(A5:ID,CLASS,STUDENTID,NAME,GENDER,SUBJECT,SCORE)

A4为子表,A5为主表,按序表A5的字段IDT的前面字段即STUDENTID对应,返回由CLASS,STUDENTID,NAME,GENDER,SUBJECT,SCORE字段组成的序表,复制主表记录,返回结果如下:

7

=A5.keys(ID)

设置A5序表的键为ID

8

=A4.news(A7,CLASS,STUDENTID,NAME,GENDER,SUBJECT,SCORE)

省略参数K,按A7的键与组表前面的字段对应,返回结果同A6

9

=A4.news@r(A7,NAME,GENDER,sum(SCORE):TotalScore)

使用@r选项,聚合子表数据:

10

=A4.news(A7,CLASS,STUDENTID,NAME,GENDER,SUBJECT,SCORE;CLASS=="Class one",SUBJECT=="Math")

关联计算时对A4的数据进行过滤,过滤条件为CLASS=="Class one"并且SUBJECT=="Math"

多个K时:

 

A

 

1

=file("sco.ctx").open()

打开组表,组表数据内容如下:

2

=file("stu.txt").import@t()

返回序表:

3

=A1.news(A2:Class:StudentID,NAME,SUBJECT,SCORE)

A1为子表,A2为主表,按序表A2的字段ClassStudentIDT的前面字段即ClassStudentID对应,返回由NAME,SUBJECT,SCORE字段组成的序表,复制主表记录,返回结果如下:

4

=A1.news@r(A2:Class:StudentID,NAME,sum(SCORE):TotalScore)

使用@r选项,聚合子表数据:

多种过滤方式

 

A

 

1

=demo.cursor("select STUDENTID,CLASS,SUBJECT,SCORE from SCORES")

游标中的数据如下:

2

=file("scores.ctx")

 

3

=A2.create@y(#STUDENTID,#CLASS,SUBJECT,SCORE )

创建组表

4

=A3.append@i(A1)

A1游标中的数据追加到组表基表中

5

=demo.query("select  ID,NAME,GENDER,AGE  from STUDENTS")

返回序表

6

=A3.news(A5:ID,STUDENTID,NAME,SUBJECT,SCORE)

将组表的键值与序表字段对应,取出组表字段,返回序表

7

=create(Subject,Num).record(["PE",01,"Math",02,"History",03]).keys(Subject)

生成Subject为键的序表

8

=A3.news(A5:ID,NAME,SUBJECT,SCORE;SUBJECT=A7.find(SUBJECT))

使用K=w过滤方式,wTi.find(K),实表中使SUBJECT=A7.find(SUBJECT)计算结果为nullfalse的记录过滤掉;SUBJECT为选出字段,赋值为序表A7的指引字段

9

=A3.news(A5:ID,NAME,SUBJECT,SCORE;SUBJECT=A7.pfind(SUBJECT))

使用K=w过滤方式,wTi.pfind(K),实表中使SUBJECT=A7.pfind(SUBJECT)计算结果为nullfalse的记录过滤掉;SUBJECT为选出字段,赋值为SUBJECT在序表A7的序号

10

=A3.news(A5:ID,NAME,SUBJECT,SCORE;SUBJECT:A7)

使用K:Ti过滤方式,用实表中SUBJECT的值与序表的键值作对比,匹配不上的将被过滤掉

11

=A3.news(A5:ID,NAME,SCORE;SUBJECT:A7)

K不被选出的情况,SUBJECT不是选出字段,仅过滤

12

=A3.news(A5:ID,NAME,SUBJECT,SCORE;SUBJECT:A7:null)

使用K:Ti:null 过滤方式,用实表中SUBJECT的值与序表的键值作对比,可以匹配上的将被过滤掉

13

=create(Score,Level).record([90,"A",80,"B",70,"C",60,"D"]).keys(Score)

返回键为Score的序表

14

=A3.news(A5:ID,NAME,SUBJECT,SCORE;(SCORE=A13.find(SCORE),

SUBJECT=A7.find(SUBJECT),SCORE!=null&&SUBJECT!=null))

使用(K1=w1,Ki=wi,w)过滤方式,返回符合所有条件的记录

 

注意:T.new()T.news()的区别,T.new()适用于TA/cs一对多关系,T.news()适用于TA/cs是多对一关系。