本章介绍news()函数的多种用法。
描述:
计算序表/排列的字段值合并生成新序表/排列。
语法:
A.news(X;xi:Fi,…)
备注:
根据序表/排列A,计算排列X后把计算后的字段合并到一个新的序表/排列,Fi为新字段名,xi为计算结果。Fi省略时会自动根据xi识别字段名(当参数xi使用#i时,表示第i列,此时使用原列名)。
参数:
A |
序表/排列 |
X |
排列或者整数;如果X为整数,则与to(X)相等,表示对A中每条记录的插入次数 |
xi |
表达式,结果为字段值,xi中的~针对排列X而非A。用#时表示用序号定位。 |
Fi |
新序表/排列的字段名,省略则自动识别 |
选项:
@1 |
左连接,当排列X为空时,则创建一条空记录 |
返回值:
新序表/排列
示例:
|
A |
|
1 |
=demo.query("select * from EMPLOYEE") |
|
2 |
=A1.group(GENDER;~:group,~.avg(SALARY):avg) |
针对GENDER做分组 |
3 |
=A2.news(group;EID,NAME,GENDER,#3:surname, age(~.BIRTHDAY):age,SALARY+50:salary,A2.avg:AvgSalary) |
A2是一个分组,针对每组计算字段值生成序表然后合并成一个新序表 |
4 |
=A1.news(2;EID,NAME,GENDER,STATE,age(A1.BIRTHDAY):AGE) |
生成一个新的序表,其中每条记录重复2次 |
5 |
=A1.group(DEPT).(~.group(GENDER)) |
针对DEPT分组,分组后继续根据GENDER分组 |
6 |
=A5.news(~;A5.~.DEPT:DEPT,A5.~.~.GENDER:GENDER,A5.~.~.avg(SALARY):AvgSalary) |
取A5分组中的DEPT和GENDER,展示各DEPT下不同GENDER的平均工资 |
7 |
=MySQL1.query("select * from EMPLOYEE") |
|
8 |
=A7.group(GENDER;~:group) |
针对MySQL1数据库EMPLOYEE表中的GENDER做分组 |
9 |
=A1.group(GENDER;avg(SALARY):avg) |
针对demo数据库EMPLOYEE表中的GENDER做分组 |
10 |
=A9.join(GENDER,A8:GENDER,group) |
|
11 |
=A10.news@1(group;EID,NAME,GENDER,age(~.BIRTHDAY):age,salary,avg:AvgSalary) |
针对每组计算字段值生成序表,GENDER为M的group排列为空,则生成一条空记录,然后合并成一个新序表 |
相关概念:
描述:
计算管道内记录的字段值合并到原管道
语法:
ch.news(X;xi:Fi,…)
备注:
根据管道ch,计算排列X后把计算后的字段合并到原管道,Fi为新字段名,xi为计算结果,Fi省略自动识别。
参数:
ch |
管道 |
X |
排列 |
xi |
表达式,结果为字段值,xi中的~针对X而非A。用#时表示用序号定位。 |
Fi |
cs的字段名,省略则自动识别 |
返回值:
管道ch
示例:
|
A |
|
1 |
=demo.cursor("select * from EMPLOYEE") |
|
2 |
=demo.query("select * from EMPLOYEE") |
|
3 |
=channel() |
创建管道 |
4 |
=A2.group(GENDER;~:group) |
针对GENDER做分组 |
5 |
=A1.groupx(GENDER;avg(SALARY):avg) |
针对GENDER做分组 |
6 |
=A5.join(GENDER,A4:GENDER,group) |
|
7 |
=A3.news(group;EID,NAME,GENDER,#3:surname,age(~.BIRTHDAY):age,SALARY+50: salary,avg:AvgSalary) |
A6是一个分组,针对每组计算字段值,最后合并到管道A3 |
8 |
=A3.fetch() |
保留管道当前数据 |
9 |
=A6.push(A3) |
将游标A6中的数据推送到管道A3,此时数据不会立即被推送到管道。 |
10 |
=A6.fetch() |
A6执行fetch()时程序才会执行管道中的计算,游标中的数据才真正被推送到管道。 |
11 |
=A3.result() |
|
描述:
计算游标字段值合并到原游标
语法:
cs.news(X;xi:Fi,…)
备注:
根据游标cs,把排列X计算后的字段合并到原游标,Fi为新字段名,xi为计算结果,Fi省略自动识别。
参数:
cs |
游标 |
X |
排列 |
xi |
表达式,结果为字段值,xi中的~针对X而非A。用#时表示用序号定位。 |
Fi |
cs的字段名,省略则自动识别 |
选项:
@1 |
左连接,当排列X为空时,则创建一条空记录 |
返回值:
原游标cs
示例:
|
A |
|
1 |
=demo.cursor("select * from EMPLOYEE") |
|
2 |
=demo.query("select * from EMPLOYEE") |
|
3 |
=A2.group(GENDER;~:group) |
针对GENDER做分组 |
4 |
=A1.groupx(GENDER;avg(SALARY):avg) |
针对GENDER做分组 |
5 |
=A4.join(GENDER,A3:GENDER,group) |
|
6 |
=A5.news(group;EID,NAME,GENDER,#3:surname,age(~.BIRTHDAY):age,SALARY+50: salary,avg:AvgSalary) |
A4是一个分组,针对每组计算字段值生成游标然后合并成一个新游标 |
7 |
=A6.fetch() |
|
8 |
=MySQL1.query("select * from EMPLOYEE") |
|
9 |
=A8.group(GENDER;~:group) |
针对GENDER做分组 |
10 |
=A4.join(GENDER,A9:GENDER,group) |
|
11 |
=A10.news@1(group;EID,NAME,GENDER,age(~.BIRTHDAY):age,salary,avg:AvgSalary) |
针对每组计算字段值生成序表,GENDER为M的group排列为空,则生成一条空记录,然后合并成一个新序表 |
12 |
=A11.fetch() |
|
相关概念:
描述:
根据序表/游标键值取出组表中的指定字段值合并生成新的序表/游标。
语法:
T.news(A/cs:K,x:C,…;wi,...)
备注:
组表T和序表A/游标cs是多对一关系,按序表A/游标cs的键/维值与T(从头开始)的字段对应,取出组表T中的指定字段值x,...,合并生成新的序表,要求A/cs对键有序,且A/cs的键对T前面字段键同序。
对比函数T.new(),该函数可将A/cs与组表T做一对多关联,结果返回与A/cs主键对应的组表T中的记录组成的结果集;而T.new()函数,相当于只能将A/cs与组表做一对一或多对一的关联。
参数:
T |
组表 |
A/cs |
序表/游标/组表游标 |
K |
字段名,A/cs后有K…参数时,则用这些字段来对应 |
x |
字段值 |
C |
列别名 |
wi |
过滤条件,多个过滤条件间用逗号间隔,且条件间为AND关系 |
选项:
@r |
复制主表记录,返回结果集按A/cs对齐,此时可聚合 |
返回值:
序表/游标
示例:
|
A |
|
1 |
=file("score.ctx").open () |
打开组表文件
|
2 |
=demo.query("select * from students").keys(ID) |
返回以ID为键的序表 |
3 |
=A1.news(A2:ID,STUDENTID,SUBJECT,SCORE;SUBJECT=="Math",SCORE>70) |
将组表A1与序表A2做关联计算,过滤条件为SUBJECT为 Math且SCORE大于70,结果返回对应的组表中的记录 |
4 |
=A1.news@r(A2:ID,NAME,sum(SCORE):TotalScore) |
对学生的分数做聚合,结果如下: |
描述:
根据集群内表/集群游标键值取出集群表中的指定字段值合并生成新的序表/集群多路游标。
语法:
T.news(A/cs,x:C,…;wi,...)
备注:
根据集群内表A/集群游标cs键值取出集群表T中的指定字段值x,...,合并生成新的序表/集多路游标,要求A/cs对键有序,且A/cs的键对T前面字段键同序。
参数:
T |
集群表 |
A/cs |
集群内表/集群游标 |
x |
字段值 |
C |
列别名 |
wi |
过滤条件,多个过滤条件间用逗号间隔,且条件间为AND关系 |
选项:
@z |
用A/cs前面字段和T的键/维对应 |
返回值:
序表/集群多路游标
示例:
|
A |
|
1 |
=file("scores.ctx",["192.168.31.165:8281"]).open() |
返回集群表 |
2 |
=file("student.ctx",["192.168.31.165:8281"]).open().memory() |
返回集群内表 |
3 |
=A1.news(A2,STUDENTID,SUBJECT,SCORE;SUBJECT=="Math",SCORE>70) |
返回序表 |