(q / kdb +)搜索列数

时间:2018-08-14 18:18:32

标签: kdb

有人可以在下面帮助我吗?

nColss:1 3 4 4.5;
aa:([]amount:250000+500000*5?10;n1M:0.5*5?4;n3M:2+0.5*5?4;n4M:4+0.5*5?4;n4.5M:6+0.5*5?4);
aa:update nRng:{[l;n] (min l | l l bin n),(l l binr n & max l)}[nColss] each aa[`amount]%1000000 from aa;
aa:update nRng2:{`$("n",'string x),'"M"} each aa[`nRng] from aa;

amount  n1M n3M n4M n4.5M   nRng    nRng2
250000  1.5 2   4   7   1 1f    `n1M`n1M
2250000 0.5 2   5   6.5 1 3f    `n1M`n3M
4250000 1.5 2.5 5   6   4 4.5   `n4M`n4.5M
250000  1   3.5 4.5 7.5 1 1f    `n1M`n1M
1250000 1   2.5 4   7   1 3f    `n1M`n3M

如何生成nValue列,每行包含nRng2列中指定的列的值?

类似这样的东西

nValue
1.5 1.5
0.5 2
5 6
1 1
1 2.5

我正在尝试类似

aa[aa[`nRng2]]

生成

index   value
0   (1.5 0.5 1.5 1 1;1.5 0.5 1.5 1 1)
1   (1.5 0.5 1.5 1 1;2 2 2.5 3.5 2.5)
2   (4 5 5 4.5 4;7 6.5 6 7.5 7)
3   (1.5 0.5 1.5 1 1;1.5 0.5 1.5 1 1)
4   (1.5 0.5 1.5 1 1;2 2 2.5 3.5 2.5)

然后我需要采用该矩阵的对角线,但是我被困在它上面。

1 个答案:

答案 0 :(得分:2)

输入示例代码后,在aa表中得到的值略有不同,但是类似的事情似乎可行:

q)aa[`nValue]:{x x`nRng2} each aa
q)aa
amount  n1M n3M n4M n4.5M nRng    nRng2       nValue 
-----------------------------------------------------
4750000 0.5 2   4.5 6     4.5 4.5 n4.5M n4.5M 6   6  
1250000 0   3.5 5   6     1   3   n1M   n3M   0   3.5
3750000 0.5 2.5 5.5 7     3   4   n3M   n4M   2.5 5.5
250000  1   3   5   6.5   1   1   n1M   n1M   1   1  
750000  0   3   4.5 7     1   1   n1M   n1M   0   0  

快速说明正在执行的操作;通过执行each aa,我们实际上是将表中的每条记录作为字典传递给lambda函数(kdb +中的表只是字典列表)。在其中,我们使用nRng2索引到记录中以获取列名,然后使用那些列名再次索引到字典中。然后,我们使用索引符号分配它,以添加新列