我希望能够从远程存储在磁盘上的超大型键表中批量选择行。作为测试我的功能的玩具示例,我设置了以下表格t
和nt
...
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]}
^
答案 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中显示的功能选择,在其中输入所需行作为第五个参数
希望这会有所帮助!