本章介绍news()函数的多种用法。
描述:
针对序列的每个成员,按照指定条件生成多条记录,合并组成新的序表。
语法:
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为序列时,对A与X的成员逐一进行计算,将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序表,返回的记录中含有字段NAME、AGE,AGE是根据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分组中的DEPT和GENDER值,计算各个DEPT下GENDER的平均工资:
|
参数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) |
将A2与A4根据GENDER字段连接,由于A2中没有GENDER为M的对应数据,所以表连接后,对应的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计算结果为序列,结果返回序列的序列:
|
相关概念:
描述:
排列按照指定条件生成多条记录,合并组成新序表返回到原管道中。
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的字段值,#2:Lname表示将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的字段值,#2:Lname表示将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(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的字段值,#2:Lname表示将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计算后,读取数据内容如下:
|
相关概念:
描述:
根据序表/游标的键与组表的字段对应,返回由指定字段组成的序表/游标。
语法:
T.news(A/cs:K…,x:C,…;wi)
备注:
组表T为子表,序表A/游标cs为主表,T与A/ cs是多对一的关系,按A/cs的键(/维)字段与T(从头开始)的字段对应,返回由x:C组成的序表/游标。要求A/cs对键(/维)有序,且A/cs的键(/维)与T前面字段同序。
参数为A时返回序表,为cs时返回游标/多路游标。
返回结果集向T对齐并设置维/键,复制主表记录。
参数:
T |
组表。 |
A/cs |
序表/游标/组表游标。 |
K |
A/cs的字段,有K时用K与T前面字段对应,K缺省用A/cs的键(/维)。多个K时用 : 隔开。 |
x |
字段名/聚合函数,支持count/sum/max/min/avg。 |
C |
列别名。 |
wi |
T的过滤条件,缺省读取全集,多个条件之间用逗号隔开,为AND关系。除常规的过滤表达式外,过滤条件中还支持如下几种写法,其中K表示实表T中的非键字段: 1.K=w w通常使用表达式Ti.find(K)或Ti.pfind(K),Ti为序表,w为null或false时将被过滤掉;当w为表达式Ti.find(K)且被选出字段C,...中包含K时,K将被赋值为Ti的指引字段; 当w为表达式Ti.pfind(K)且被选出字段C,...中包含K时,K将被赋值为K在Ti 中的序号。 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将被赋值为Ki在Ti 中的序号。 w为过滤表达式, w中可引用Ki。 3.K:Ti Ti为序表,用实表中Ki的值与Ti的键值作对比,匹配不上的将被过滤掉;当选出字段C,...中包含K时,K将被赋值为Ti的指引字段。 4.K: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) |
创建组表,STUDENTID、CLASS为组表的维。 |
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的字段ID与T的前面字段即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的字段Class、StudentID与T的前面字段即Class、StudentID对应,返回由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过滤方式,w是Ti.find(K),实表中使SUBJECT=A7.find(SUBJECT)计算结果为null或false的记录过滤掉;SUBJECT为选出字段,赋值为序表A7的指引字段
|
9 |
=A3.news(A5:ID,NAME,SUBJECT,SCORE;SUBJECT=A7.pfind(SUBJECT)) |
使用K=w过滤方式,w是Ti.pfind(K),实表中使SUBJECT=A7.pfind(SUBJECT)计算结果为null或false的记录过滤掉;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()适用于T和A/cs是一对多关系,T.news()适用于T和A/cs是多对一关系。