在kdb中连接多次

时间:2016-08-17 21:33:41

标签: kdb

我有两张桌子

表1(订单)列:(日期,符号,数量) 表2(marketData)列:(日期,符号,收盘价)

我想将T + 0到T + 5的关闭添加到表1。

{[nday]
    value "temp0::update date",string[nday],":mdDates[DateInd+",string[nday],"] from orders";
    value "temp::temp0 lj 2! select date",string[nday],":date,sym,close",string[nday],":close from marketData";  
    table1::temp   
} each (1+til 5)

我确信有更好的方法可以做到这一点,但是当我尝试运行此函数时出现'循环错误。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

有关常见错误,请参阅here。您的循环错误是因为您使用value设置了视图,而不是全局变量。函数value内部的评估就好像它在函数之外,所以你不需要::

那说还有很大的改进空间,这里有一些指示。

根据您的情况,您根本不需要value。例如。这一行:

第一行可以简化为(我假设mdDates是某种函数,你只需从一个整数中计算出日期,DateInd一些一种全球性的):

{[nday]
  temp0:update date:mdDates[nday;DateInd] from orders;
  ....
} each (1+til 5)

在这一点上,您似乎只是想尝试在列名称上附加内容:

select date",string[nday],":date

请记住,表格是翻转的词典......你可以通过键弄乱他们的列名,如下图所示(非常难得):

q)t:flip `a`b!(1 2; 3 4)
q)t
a b
---
1 3
2 4
q)flip ((`$"a","1"),`b)!(t`a;t`b)
a1 b
----
1  3
2  4

你也可以使用功能选择,这是更整洁的IMO:

q)?[t;();0b;((`$"a","1"),`b)!(`a`b)]
a1 b
----
1  3
2  4

答案 1 :(得分:0)

好像您想拥有p0p5列,其价格对应于date+0date+5日期。

使用副词over迭代05天:

q)orders:([] date:(2018.01.01+til 5); sym:5?`A`G; qty:5?10)
q)data:([] date:20#(2018.01.01+til 10); sym:raze 10#'`A`G; price:20?10+10.)

q)delete d from {c:`$"p",string[y]; (update d:date+y from x) lj 2!(`d`sym,c )xcol 0!data}/[ orders;0 1 2 3 4]
date       sym qty p0       p1       p2       p3       p4
---------------------------------------------------------------
2018.01.01 A   0   10.08094 6.027448 6.045174 18.11676 1.919615
2018.01.02 G   3   13.1917  8.515314 19.018   19.18736 6.64622
2018.01.03 A   2   6.045174 18.11676 1.919615 14.27323 2.255483
2018.01.04 A   7   18.11676 1.919615 14.27323 2.255483 2.352626
2018.01.05 G   0   19.18736 6.64622  11.16619 2.437314 4.698096