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

KDB\Q:如何从ticker函数中运行迭代联合联接?,kdb,Kdb,我正试图根据kdb tick体系结构,从tick函数中对表运行迭代联合联接,如下所示: 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 u

我正试图根据kdb tick体系结构,从tick函数中对表运行迭代联合联接,如下所示:

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
    }
非描述性错误:

“表1
[0]()

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

您得到的“表1”是一个错误,因为它没有在
.z.ts
中本地定义。在kdb中,如果函数中有特定变量的局部赋值,kdb将在函数中局部引用该变量。在
table1
的示例中,您在
.z.ts
中本地分配它,但随后尝试引用您在
.z.ts
之外全局分配的
table1
。要解决您的问题,您必须在
.z.ts
中全局分配
表1
,就像这样
表1::表1 uj表2

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

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

一般来说

如果返回的信号不是之一,则这是由于作用域

这假设您没有从给定列表中指定变量名称,这是出于这个原因的最佳实践。如果您遵循这种做法,您就会知道,如果返回变量名,这是由于范围问题造成的


Re:范围界定,kdb不具备词汇范围界定,有关kdb范围界定的更多详细信息,请参见。然而,正如Matt所详述的,这是由于kdb解析器在本地/全局混合赋值中发生冲突造成的

这与您提出的另一个问题不一样吗?您的代码片段中有几个问题:1。你是想两次加入工会,还是只是为了展示?2.您的语句末尾是否没有分号,或者您只是为了显示而没有显示分号?3.使用union join
uj
时,不能按名称引用表,必须按值引用表。换句话说,您不能在表名前面加上反勾号,您必须使用
table1:table1 uj table2