一元kdb函数中的参数化选择查询

时间:2019-03-17 19:02:18

标签: kdb

我希望能够从远程存储在磁盘上的超大型键表中批量选择行。作为测试我的功能的玩具示例,我设置了以下表格tnt ...

t:([sym:110?`A`aa`Abc`B`bb`Bac];px:110?10f;id:1+til 110)
nt:0#t

我从表中仅选择以字符“ A”开头的记录,对字符数进行计数,将计数除以我希望为每个函数调用获取的行数(10),然后将其四舍五入到最接近的整数...

aRec:select from t where sym like "A*"
counter:count aRec
divy:counter%10
divyUP:ceiling divy

接下来,我将idx变量设置为0并编写一个if statement作为参数化函数。这将检查idx是否等于divyUP。如果不是,那么它应该选择aRec的前10行,将它们向上插入nt表,将函数参数x递增10,并递增{{1} }变量乘以1。一旦idx变量和idx相等,则应退出函数...

divyUP

但是,当我调用该函数时,它会返回idx:0 batches:{[x]if[not idx=divyUP;batch::select[x 10]from aRec;`nt upsert batch;x+:10;idx+::1]} 错误...

type

我也尝试过与q)batches 0 'type [1] batches:{[x]if[not idx=divyUP;batch::select[x 10]from aRec;`nt upsert batch;x+:10;idx+::1]} ^ 一起使用它,尽管得到的结果相同...

sublist

但是,在函数之外发出上述两个命令中的任何一个都会返回预期的结果...

batches:{[x]if[not idx=divyUP;batch::x 10 sublist aRec;`nt upsert batch;x+:10;idx+::1]}

q)batches 0
'type
[1]  batches:{[x]if[not idx=divyUP;batch::x 10 sublist aRec;`nt upsert batch;x+:10;idx+::1]}
                                          ^

2 个答案:

答案 0 :(得分:2)

问题在于,在您的示例中,select []和子列表需要列表作为输入,但是您的输入不是列表。原因是当items中有一个变量(将形成一个列表)时,它不再被视为简单列表,这意味着不能使用空格(空格)来分隔值。在这种情况下,需要使用分号。

q) x:2
q) (1;x) / (1 2)

选择命令:将输入更改为(x; 10)以使其起作用。

q) t:([]id:1 2 3; v: 3 4 5)
q) {select[(x;2)] from t} 1
`id  `v
---------
 2    4
 3    5

另一种替代方法是使用“ i”(索引)列:

q) {select from t where i within x + 0 2} 1

子列表命令:将子列表功能的左输入转换为列表(x; 10)。

 q) {(x;2) sublist t}1

答案 1 :(得分:1)

您不能将select []形式用于这样的变量输入,而是可以使用https://code.kx.com/q4m3/9_Queries_q-sql/#912-functional-forms中显示的功能选择,在其中输入所需行作为第五个参数

希望这会有所帮助!