【问题标题】:How can I delete a column by index from a kdb table?如何从 kdb 表中按索引删除列?
【发布时间】:2018-09-25 10:46:07
【问题描述】:

例如,您将如何从下表中删除第一列:

q)t: ([] a: (2018.09.25; 2018.09.25; 2018.09.25); b: `ABC`XYZ`BAC ; c: (10 20 30))
q)t
a          b   c
-----------------
2018.09.25 ABC 10
2018.09.25 XYZ 20
2018.09.25 BAC 30

预期结果:

b   c
---------
ABC 10
XYZ 20
BAC 30

可以使用delete a from t,但我希望能够在事先不知道确切列名的情况下删除。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    您可以使用功能删除:

    q){[t;index]![t;();0b;enlist cols[t]index]}[t;0]
    b   c 
    ------
    ABC 10
    XYZ 20
    BAC 30
    

    https://code.kx.com/q/ref/funsql/#delete

    使用 parse 来查看 q-sql 语句在函数形式中的样子:

    q)parse"delete a from t"
    !
    `t
    ()
    0b
    ,,`a
    

    【讨论】:

    • 如果你将一个空列表加入到索引中,它将适用于原子参数或列表参数,而不是使用enlist,例如{[t;index]![t;();0b;cols[t] (),index]}[t;0]{[t;index]![t;();0b;(),cols[t](),index]}[t;0 1]
    【解决方案2】:

    你可以使用

    {(_/[cols x;desc y])#x}[t;0 2]
    

    这会获取表的列,获取要删除的索引并使用删除扫描删除这些列。如果您只想删除一个索引,则必须登记,如下所示:

    {(_/[cols x;desc y])#x}[t;enlist 0] 
    

    【讨论】:

    • 如果您将一个空列表加入到索引中,它将适用于原子参数或列表参数。 {(_/[cols x;desc (),y])#x}[t;1]{(_/[cols x;desc (),y])#x}[t;0 1]
    【解决方案3】:

    如果您的表没有键,那么您可以从字典中进行简单的删除:

     q) f:{[t;ind] enlist[cols[t] ind]_t}
     q) f[t;0] 
     b   c 
     ------
     ABC 10
     XYZ 20
     BAC 30
    

    【讨论】:

    • 很好 - 如果您将其更改为 ((),cols[t]ind)_t 它也适用于多个索引
    【解决方案4】:

    使用flipdrop

    q)flip 1_flip 0!t
    b   c
    ------
    ABC 10
    XYZ 20
    BAC 30
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 2010-10-12
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多