align()

阅读(596) 标签: 序列, 排序, 对齐,

P.align()

描述:

排列按照另一个序列排序/对齐

语法:

P.align(A:x,y)

x,y省略时,以P当前记录与A中成员对齐

P.align(n,y)

等同于P.align(to(n),y),支持@r

备注:

通过关联字段xyP的记录按照A对齐。对着排列P计算y的值,计算结果和A中的x的值相等则表示两者对齐。

此函数主要应用于主子表的情况,子表通常有个ref字段和主表关联,用来引用主表的关联记录,x表达式往往就是这个ref字段,于是从子表里读取ref字段的值,判断与主表的记录是否相同,如果相同,则表示对齐。

一般情况,主子表之间是一对多的关系,即A中一条记录和P中多条记录关联,因此把P中关联的多条记录组成一个序列作为成员存在结果序列里。结果序列的成员个数和A是相同的。

参数:

P

子排列/子序表

A

用于对齐的序列或排列,一般是主表

x

A中用于关联的字段或者字段表达式,缺省解释为~

y

P的对齐表达式,缺省解释为P.~

n

整数

选项:

@a

返回P记录按照A成员对齐的所有成员,并且把结果序列分组。缺省仅返回第一个成员。

@b

A为有序序列时,使用二分法查询

@r

y为数列,y中每个成员作为对齐位置,将P重复分组到n中指定位置

@p

返回值由成员在P中的序号构成

@n

返回P记录按照A成员对齐的所有成员,并且结果集多出一组,用于存放对不上的成员

@s

P中记录按照A中成员的次序排序,其中无法与A对应的成员排在最后。

返回值:

对齐后的P

示例:

Ø  子表向主表对齐后计算

 

A

 

1

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

 

2

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

 

3

=A2.align@a(A1:DEPT,DEPT)

EMPLOYEE表按照DEPARTMENT表对齐,且返回所有成员

4

=A1.new(DEPT, A3(#).count():NUMBER)

 

然后将A3A1关联计算

5

=A2.align(A1:DEPT,DEPT)

缺省返回第一个符合条件的成员

 

Ø  用于特殊排序

 

A

 

1

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

2

=A1.sort(class)

使用sort按照class排序,class字段按照four/one/three/two展示

3

=A1.group(class)

使用group按照class分组,class字段按照four/one/three/two展示

4

=["class one","class two","class three","class four"]

 

5

=A1.align@a(A4,class)

使用align@a选项对齐所有成员,使得class字段按照A4的顺序排序,并且把结果序列分组

 

Ø  整数对齐,常用于加快运算速度

 

A

 

1

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

 

2

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

3

=A1.align@b(A2:EID,EID)

A2有序,使用二分法加快查找速度

 

Ø  @r选项,将主表按照数列指定的位置和子表重复对齐

 

A

 

1

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

 

2

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

 

3

=A1.derive(A2.pselect@a(EID==A1.EID): SubtableNo)

先找出与FAMILY对应的EMPLOYEE记录序号,把序号作为数列存储在SubtableNo字段里

4

=A3.align@r(11,SubtableNo)

利用SubtableNo字段直接和n对齐

5

=A3.align@rp(11,SubtableNo)

增加@p选项,返回记录序号,不是记录本身

 

Ø  @n选项,将主表和子表对齐返回所有成员,最后一组结果集存放对不上的成员

 

A

 

1

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

 

2

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

 

3

=A1.align@n(A2:ID,ID)

[5,6,7]中的成员为对不上的一组

 

Ø  @s选项,将子表记录按照主表成员排序。

 

A

 

1

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

 

2

=demo.query("select * from STUDENTS1 order by ID desc ")

 

3

=A1.align@s(A2:ID,ID)