KDB \ Q:如何从置顶函数中运行迭代联合联接?

时间:2019-09-03 02:58:17

标签: kdb

我试图根据kdb的滴答架构在滴答函数中对表运行迭代联合联接:

table1:([]time:`timespan$();sym:`symbol$();var1:`float$());

if[not system"t";system"t 1000";
    .z.ts:{
        table2: ...
        table1:table1 uj table2 / throws non descriptive error
        `table1 uj table2 / throws type error
    }

非描述性错误:

  

'table1
  [0]()

我试图维护一个本地表,该表保留最后500行左右(带有动态列),以便运行进一步的处理。 但是我似乎无法从tick函数中更新表。 一个人应该如何实现这一功能? 谢谢

2 个答案:

答案 0 :(得分:7)

您正在获取'table1作为错误,因为它不在.z.ts中本地定义。在kdb中,如果对函数中的特定变量进行了本地分配,则kdb在函数中本地引用该变量。在table1的示例中,您在.z.ts内进行本地分配,然后尝试引用在table1之外全局分配的.z.ts。要解决您的问题,您必须像table1这样在.z.ts内全局分配table1::table1 uj table2

table1:([]time:`timespan$();sym:`symbol$();var1:`float$());

if[not system"t";system"t 1000";
    .z.ts:{
        table2: ...
        table1::table1 uj table2

答案 1 :(得分:4)

作为一般规则

  

如果返回的信号是不是basic errors 之一,则归因于范围界定

这假设您没有从给定列表中给出变量名,因此这是最佳实践。如果您遵循这种做法,那么您会知道,如果返回变量名,则是由于范围问题。

关于:范围,kdb不具有词汇范围,可以在herehere中找到有关kdb范围的更多详细信息。但是,正如Matt所详述的,这是由于kdb分析器在本地/全局混合分配中发生冲突