(q/kdb+) 搜索列金额

(q/kdb+) Search column amounts

有人可以帮我解决以下问题吗?

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)

然后我需要取这个矩阵的对角线,但我坚持了下来。

当我输入您的示例代码时,我在 aa table 中得到的值略有不同,但像这样的东西似乎有效:

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,我们实际上是将 table 中的每条记录作为字典传递给 lambda 函数(kdb+ 中的 table 只是一个字典列表)。在此我们使用 nRng2 对记录进行索引以获取列名,然后使用 those 列名再次对字典进行索引。然后我们使用索引符号分配它以添加新列