在不使用全局变量的情况下附加数据

时间:2018-05-23 02:40:13

标签: kdb

通常我必须使用全局变量结果联合连接来附加一些数据。

res();
{[someVar]
    res,:: select x from y where (constraints related to someVar)
} each list of someVars

这不是非常实用的风格。有没有不同的方法来实现这个w / o全局变量?

2 个答案:

答案 0 :(得分:4)

有几点:

  1. 当您正在进行追加就地(又称a,:b而不是a::a,b)时,您不需要全局指定双冒号。在这种情况下,单个将起作用,因为就地附加在全局上下文中起作用。

  2. 即使它不是“功能性的”并且使用全局上下文,你也会忽略这样一个事实,即追加即使在内存方面非常有效。例如:

    q)\ts t:([]col1:10000000?100j)
    110 134218192
    
    q)\ts a:{x,select from y}/[t;2 cut ([]col1:til 6)]
    74 268436720
    
    q)\ts {t,:x} each 2 cut ([]col1:til 6)
    0 1424
    q)a~t
    1b
    
  3. 使用over(/)并避免全局变量的迭代方法会创建表的副本,从而使内存使用量翻倍。就地附加使用非常少的内存来获得相同的结果。

    所以最终在某些情况下,让全局变得有价值,取决于具体情况。

答案 1 :(得分:2)

res:(),/{[someVar]
    select x from y where (constraints related to someVar)
} each someVars

将获取返回表的列表,并使用over副词(/)

将它们连接回res

https://code.kx.com/q/ref/adverbs/#over