游标归并与连接

阅读(1268) 标签: 游标归并, 游标连接,

在使用序表计算时,可以将多个序表中的数据整合起来分析计算。如用A.merge()将各个序表中的记录有序归并,或者用A.conj()函数将它们中的记录依次纵向连接成一个总表。还可以用joinjoin@p或者xjoin这几个连接函数,将多个序表中的数据连接起来,利用它们之间的关联性来查询或计算。

相应的,在用游标处理大数据运算时,同样可以使用游标的归并与连接。在这里,我们将了解一下如何使用CS.conjx(), CS.mergex(x), joinx()等函数,来将多个游标中的数据归并或连接。

有序归并

在很多时候,数据可能会存储在多个数据表中,如多种产品的销售记录,各部门员工的资料等。在这种情况下,我们需要将多个数据表中的数据合并在一起使用。对于普通的多个同构序表,在集算器中,可以用A.conj() 或者A.merge(x) 将各个序表中的记录合并成排列使用。如果数据表中使用大数据,也可以用CS.conjx() 以及CS.mergex(x) 将游标序列CS中各个游标的数据合并,并在读取时归并读出。

由于游标中的数据仅会遍历一次,且通常不会一次全部读出,这样,从游标中读取数据时,是无法在全部归并读取后再重新排序的,因此在归并多个游标的数据时,要求各个游标中的数据必须是有序的。

 

下面,我们用实际例子了解一下CS.conjx() CS.mergex(x) 的使用方法和不同之处。先来看简单纵向连接的情况:

 

A

B

C

1

=file("Order_Wines.txt")

 

 

2

=file("Order_Electronics.txt")

 

 

3

=file("Order_Foods.txt")

 

 

4

=file("Order_Books.txt")

 

 

5

=[A1:A4].(~.cursor@t())

 

 

6

=A5.conjx()

300

 

7

for

=A6.fetch(B6)

 

8

 

if B7==null

break

9

 

=B7(1).Type

=B7(B6).Type

10

 

if B9!=C9

break

11

>A6.close()

 

 

由四个文本数据分别记录酒类、电器、食品和图书四类商品的订单情况,在A6中将四个文本数据游标中的数据纵向连接。为了了解取出数据的顺序,在后面的代码中,每次读出300条记录,一旦其中出现不同种类的订单数据时,即中止读取。此时可以在B7中看到读出的序表如下:

从结果中可以看到,连接后的游标,在第1个文本数据表中所有酒类的订单数据全部读取完毕后,开始读取第2个文本数据表中的电器数据。即使用CS.conjx() 函数简单连接后,结果游标中的记录将按照游标序列CS中的各个游标的顺序依次读出。

 

在更多的情况下,我们并不是仅需将各个数据表中的记录依次连接,而是希望将各个数据表中的数据按照一定的顺序归并在一起,此时可以使用CS.mergex(x) 函数,需要注意的是,使用这个函数时,游标序列CS中的每个游标中的记录必须均对表达式x有序。如,将各类商品的订单数据按照销售日期排序归并:

 

A

B

1

=file("Order_Wines.txt")

 

2

=file("Order_Electronics.txt")

 

3

=file("Order_Foods.txt")

 

4

=file("Order_Books.txt")

 

5

=[A1:A4].(~.cursor@t())

 

6

=A5.mergex(Date)

300

7

for

=A6.fetch(B6)

8

 

break

9

>A6.close()

 

在这里,我们的目的是了解有序归并后,游标中记录的读取顺序,因此只读取前300条,B7中的序表如下:

可以看到,读取数据时,将按照指定的顺序Date依次读出,在读出11日所有酒类的订单数据后,将开始读取11日所有的电器订单数据,由于使用游标读取数据时只能从前往后单向进行,因此每个游标中的订单数据必须按日期完成排序。使用CS.mergex() 函数有序归并后,结果游标在读取记录时,将通过比较各个数据表中当前计算表达式的值,选择用序列CS中的哪个游标取数。这样,最终就可以获得指定顺序的结果,在取数时,每个游标仍然遍历1次各个数据表中的记录。

在将多个游标中的数据有序归并时,只是将多个游标合并为一个,并调整了用各个游标读取记录的顺序,而不会增加或减少记录数据。

 

如果游标中的数据并非有序,那么必须在归并前将游标中的数据排序,如:

 

A

B

1

=file("Order_Wines.txt")

 

2

=file("Order_Electronics.txt")

 

3

=file("Order_Foods.txt")