1

我有两个不同的系统将数据推送到 kdb 表中。这些是由价格推动的。我想比较产生的值,以便最终标记出较大的差异。不过,我对 kdb 很陌生,并且发现甚至很难制定出起点查询。

最终,我想花一个时间段(可能是一分钟)在这个时间段内为每个系统找到一行,其中驱动价格相同,并比较派生值。

不过,对我来说,一个好的起点是了解如何在一个时间段内为每个系统获取第一行并比较/加入..

谢谢。

简化的示例数据

例子: -

System             | Time    | driver | result1 | result2
systemA.instrument1| 11:59:59| 101.4  | 3.4     | 4.6
systemA.instrument1| 12:00:01| 101.5  | 3.8     | 4.8
systemA.instrument1| 12:00:02| 101.6  | 3.3     | 2.3
systemA.instrument2| 12:00:02| 106.6  | 11.1    | 11.3
systemA.instrument1| 12:00:05| 101.7  | 3.9     | 5.6
systemB.instrument1| 12:00:09| 101.1  | 3.2     | 7.8
systemB.instrument1| 12:00:14| 101.2  | 3.9     | 3.4
systemB.instrument1| 12:00:17| 101.3  | 3.1     | 8.9
systemB.instrument2| 12:00:19| 106.5  | 11.2    | 11.4
systemB.instrument1| 12:00:58| 101.7  | 3.9     | 9.3
systemB.instrument1| 12:00:59| 101.7  | 3.3     | 3.4
systemB.instrument1| 12:01:03| 101.4  | 3.1     | 5.6

我只想要 12:00:00 - 12:00:59 的数据

SystemA 和 SystemB 仪器 1 之间唯一匹配的驱动程序是 101.7。我想要么被使用,要么显示结果之间的差异。对于instrument2,驱动程序永远不会匹配,所以我想使用系统之间最接近的驱动程序价格。

results      | driver | driver diff | result1diff | result2diff
instrument1  | 101.7  | 0           | 0           | 3.7
instrument2  |        | 0.1         | 0.1         | 0.1
4

1 回答 1

1

首先,将您的 System 列拆分为其组成部分:

table:(flip exec `System`Instrument!flip ` vs/: System from table)
    ,'delete System from table

您的第一个问题(按仪器和系统获取第一行)的答案是:

q)table:(flip exec `System`Instrument!flip ` vs/: System from table),'delete System from table
Instrument  System | Time     driver result1 result2
-------------------| -------------------------------
instrument1 systemA| 11:59:59 101.4  3.4     4.6    
instrument1 systemB| 12:00:09 101.1  3.2     7.8    
instrument2 systemA| 12:00:02 106.6  11.1    11.3   
instrument2 systemB| 12:00:19 106.5  11.2    11.4   

顺便说一句,在 q 中,请求最后一行是更常见的用例,这更容易实现:

q)select by Instrument,System from table

定义函数以查找两个数值向量中最接近值的索引:

q)closest:{a:a?min a:abs(-) ./: x cross y;(a div count y;a mod count y)}

查询距离最近的驱动程序的 result1:

q)select result1:result1(value group System)@'closest . value driver group System by Instrument from table

Instrument | result1  
-----------| ---------
instrument1| 3.4  3.1 
instrument2| 11.1 11.2
于 2014-05-10T18:10:59.503 回答