本章介绍derive()的多种用法。
描述:
为序表/排列添加字段
语法:
P.derive(xi :Fi,…)
备注:
给序表/排列P增加Fi,…字段,形成 " P中原有的字段, Fi,…" 结构的序表,然后对P的每条记录遍历,给每个Fi赋值为xi。
参数:
Fi |
字段名,此时Fi不能与P中原有字段同名 |
xi |
表达式, 计算结果作为字段值 |
P |
序表/排列 |
选项:
@m |
数据量大的复杂运算中并行计算提升性能,计算次序不确定。 |
@i |
有xi计算结果为空时不生成该行记录(原记录字段不控制) |
@f(…;n) |
抄原字段时,将字段取值为记录的字段展开,n为层数,缺省为2 |
返回值:
添加字段后的序表
示例:
|
A |
|
1 |
=demo.query("select NAME,BIRTHDAY,HIREDATE from EMPLOYEE") |
|
2 |
=A1.derive(interval@y(BIRTHDAY, HIREDATE):EntryAge, age(HIREDATE):WorkAge) |
|
3 |
=A1.derive@m(age(HIREDATE):WorkAge) |
数据量大时提升性能 |
4 |
=file("D:\\txt_files\\data1.txt").import@t() |
data1.txt中内容如下: |
5 |
=A4.derive@i(SCORE:score_not_null) |
SCORE计算结果为空时,对应的该条记录不生成 |
6 |
=demo.query("select * from DEPARTMENT") |
|
7 |
=demo.query("select NAME,GENDER,DEPT,SALARY from EMPLOYEE") |
|
8 |
>A7.switch(DEPT,A6:DEPT) |
将A7表中的DEPT字段值切换为记录 |
9 |
=A7.derive(SALARY*5:BONUS) |
添加字段BONUS |
10 |
=A7.derive@f(SALARY*5:BONUS) |
使用@f选项,将原字段取值为记录的子弹展开,默认展开两层。 |
注意:
new()和 derive()的区别:new()是重新构造了一个序表,不改变原序表;而derive()方法是先抄录原有字段再增加字段。
描述:
由排列生成序表
语法:
P.derive()
备注:
由排列P产生一个数据结构相同的序表,以便使用序表相关的函数。
参数:
P |
排列 |
选项:
@o |
不复制,将改变记录的指向结构,字段数不匹配者也被调整。 性能更好但有出错风险,仅在原记录所在序表可丢弃时使用! |
返回值:
序表
示例:
|
A |
|
1 |
=demo.query("select * from SCORES") |
|
2 |
=A1.select(SCORE>90) |
结果为排列 |
3 |
=A2.derive() |
由排列生成序表 |
4 |
=A2.derive@o() |
直接引用排列中的记录而不是产生新记录 |
描述:
为管道内的记录添加字段
语法:
ch.derive(xi :Fi,…)
备注:
给管道ch增加Fi,…字段,形成" ch中原有的字段, Fi,…"结构的管道,然后对ch的每条记录遍历,给每个Fi赋值为xi。
该函数属于附加计算动作。
参数:
ch |
管道 |
Fi |
字段名,此时Fi不能与ch中原有字段同名 |
xi |
表达式,计算结果作为字段值 |
选项:
@i |
有xi计算结果为空时不生成该行记录(原记录字段不控制) |
返回值:
管道
示例:
|
A |
|
1 |
=demo.cursor("select NAME,BIRTHDAY,HIREDATE from Employee") |
|
2 |
=file("D:\\txt_files\\data1.txt").import@t() |
data1.txt中内容如下: |
3 |
=channel() |
创建管道 |
4 |
=channel() |
创建管道 |
5 |
=A3.derive(interval@y(BIRTHDAY,HIREDATE):EntryAge, age(HIREDATE):WorkAge) |
在原管道的基础上添加EntryAge和WorkAge字段 |
6 |
=A3.fetch() |
A3管道附加结果集函数ch.fetch(),保留管道当前数据 |
7 |
=A4.derive@i(SCORE:score_not_null) |
SCORE为空时,对应的该条记录不生成 |
8 |
=A4.fetch() |
A4管道附加结果集函数ch.fetch() |
9 |
=A1.push(A3) |
将游标A1中的数据推送到管道A3,此时数据不会立即被推送到管道。 |
10 |
=A2.push(A4) |
将序列A2中的数据推送到管道A4 |
11 |
=A1.skip() |
A1执行skip()时程序才会执行管道中的计算,游标中的数据才真正被推送到管道。 |
12 |
=A3.result() |
|
13 |
=A4.result() |
|
描述:
为游标添加字段
语法:
cs.derive(xi :Fi,…)
备注:
给游标cs增加Fi,…字段,形成" cs中原有的字段, Fi,…"结构的原游标,然后对cs的每条记录计算表达式xi,支持多路游标。
参数:
cs |
游标 |
Fi |
字段名,此时Fi不能与cs中原有字段同名 |
xi |
表达式,计算结果作为字段值 |
选项:
@i |
有xi计算结果为空时不生成该行记录(原记录字段不控制) |
返回值:
原游标cs
示例:
|
A |
|
1 |
=demo.cursor("select NAME,BIRTHDAY,HIREDATE from Employee") |
|
2 |
=A1.derive(interval@y(BIRTHDAY,HIREDATE):EntryAge, age(HIREDATE):WorkAge) |
在原游标的基础上添加EntryAge和WorkAge字段 |
3 |
=A2.fetch() |
|
4 |
=file("D:\\txt_files\\data1.txt").cursor@t() |
data1.txt中内容如下: |
5 |
=A4.derive@i(SCORE:score_not_null) |
SCORE计算结果为空时,对应的该条记录不生成 |
6 |
=A5.fetch() |
|
相关概念: