代码之家  ›  专栏  ›  技术社区  ›  marrowgari

在一元kdb函数中参数化select查询

kdb
  •  0
  • marrowgari  · 技术社区  · 5 年前

    我希望能够从远程存储在磁盘上的一个非常大的键控表中批量选择行。作为测试函数的一个玩具示例,我设置了以下表格 t nt ...

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

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

    idx if statement 作为参数化函数。检查是否 等于 divyUP . 如果不是,那么它应该选择 aRec ,向上插入 表,增加函数参数, x ,并将 idx公司 idx公司 变量和 它应该退出函数。。。

    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]}
                                              ^
    

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

    q)select[0 10] from aRec
    sym| px        id
    ---| ------------
    A  | 4.236121  1
    A  | 5.932252  3
    Abc| 5.473628  5
    A  | 0.7014928 7
    Abc| 3.503483  8
    A  | 8.254616  9
    Abc| 4.328712  10
    A  | 5.435053  19
    A  | 1.014108  22
    A  | 1.492811  25
    
    q)0 10 sublist aRec
    sym| px        id
    ---| ------------
    A  | 4.236121  1
    A  | 5.932252  3
    Abc| 5.473628  5
    A  | 0.7014928 7
    Abc| 3.503483  8
    A  | 8.254616  9
    Abc| 4.328712  10
    A  | 5.435053  19
    A  | 1.014108  22
    A  | 1.492811  25
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Rahul    5 年前

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

    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
    

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

    子列表命令: 将子列表函数的左输入转换为列表(x;10).

     q) {(x;2) sublist t}1
    
        2
  •  1
  •   Fiona Morgan    5 年前

    https://code.kx.com/q4m3/9_Queries_q-sql/#912-functional-forms 其中输入所需的行作为第五个参数