Kdb 列的条件更新

Kdb 列的条件更新,kdb,Kdb,我有一个交易表,包括日期、时间、符号、数量、收盘拍卖数量 不幸的是,收盘拍卖量包含在表的最后一个栏位中,使问题复杂化的是,它可能发生在半天内的15:59:00或12:59:00 有没有办法有条件地更新卷以删除关闭的卷 e、 g如果存在,则从15:59:00的卷中删除,否则从12:59:00的卷中删除 比如说 t:([]date:2019.02.01 2019.02.01 2019.02.02 2019.02.02;time:12:59:00 15:59:00 12:59:00 15:59:00;

我有一个交易表,包括日期、时间、符号、数量、收盘拍卖数量

不幸的是,收盘拍卖量包含在表的最后一个栏位中,使问题复杂化的是,它可能发生在半天内的15:59:00或12:59:00

有没有办法有条件地更新卷以删除关闭的卷

e、 g如果存在,则从15:59:00的卷中删除,否则从12:59:00的卷中删除

比如说

t:([]date:2019.02.01 2019.02.01 2019.02.02 2019.02.02;time:12:59:00 15:59:00 12:59:00 15:59:00;sym:`AAPL`AAPL`AAPL`AAPL;volume:100 25000 26000 0; closingvol: 24000 24000 21000 21000) 

**date**|**time**|**sym**|**volume**|**closingvol**
:-----:|:-----:|:-----:|:-----:|:-----:
2019-02-01|12:59:00|AAPL|100|24000
2019-02-01|15:59:00|AAPL|25000|24000
2019-02-02|12:59:00|AAPL|26000|21000
2019-02-02|15:59:00|AAPL|0|21000
我想成为

**date**|**time**|**sym**|**volume**|**closingvol**
:-----:|:-----:|:-----:|:-----:|:-----:
2019-02-01|12:59:00|AAPL|100|24000
2019-02-01|15:59:00|AAPL|1000|24000
2019-02-02|12:59:00|AAPL|5000|21000
2019-02-02|15:59:00|AAPL|0|21000
我希望我可以通过下面的内容逃脱惩罚,但or的行为显然不像我希望的那样,因为它从未修改第二个12:59:00条目

update volume:volume-closingvol from t where (time=15:59:00 | time=12:59:00), volume>=closingvol

**date**|**time**|**sym**|**volume**|**closingvol**
:-----:|:-----:|:-----:|:-----:|:-----:
2019-02-01|12:59:00|AAPL|100|24000 
2019-02-01|15:59:00|AAPL|1000|24000
2019-02-02|12:59:00|AAPL|26000|21000
2019-02-02|15:59:00|AAPL|0|21000
**更新1**

根据建议,我还尝试:

更新卷:从t开始的卷closingvol,其中时间=15:59:00 |时间=12:59:00,卷>=closingvol

e、 g.如下图所示,所有卷均已更新。我本以为2019.02.01只会更新AAPL的15:59:00和BAC的12:59:00,2019.02.02只会更新BAC的15:59:00和AAPL的12:59:00,但这修改了12:59:00和15:59:00的所有实例

t:([]date:2019.02.01 2019.02.01 2019.02.02 2019.02.02 2019.02.02 2019.02.02 2019.02.01 2019.02.01;time:12:59:00 15:59:00 12:59:00 15:59:00 12:59:00 15:59:00 12:59:00 15:59:00;sym:`AAPL`AAPL`AAPL`AAPL`BAC`BAC`BAC`BAC;volume:100 25000 26000 0 20000 12000 13000 0; closingvol: 24000 24000 21000 21000 11000 11000 12000 12000)

t:`date`time xasc t

update volume:volume-closingvol from t where (time=15:59:00)|(time=12:59:00), volume>=closingvol


**date**|**time**|**sym**|**volume**|**closingvol**
:-----:|:-----:|:-----:|:-----:|:-----:
2019-02-01|12:59:00|AAPL|100|24000
2019-02-01|12:59:00|BAC|1000|12000
2019-02-01|15:59:00|AAPL|1000|24000
2019-02-01|15:59:00|BAC|0|12000
2019-02-02|12:59:00|AAPL|5000|21000
2019-02-02|12:59:00|BAC|9000|11000
2019-02-02|15:59:00|AAPL|0|21000
2019-02-02|15:59:00|BAC|1000|11000

当q从右向左计算where子句中的每个约束时,出现以下情况:

q)time:12:59:00 15:59:00 12:59:00 15:59:00
q)15:59:00 | time=12:59:00
15:59:00 15:59:00 15:59:00 15:59:00
|在本例中的行为与max相同:

只需更改括号的位置:

q)update volume:volume-closingvol from t where (time=15:59:00)|time=12:59:00, volume>=closingvol
date       time     sym  volume closingvol
------------------------------------------
2019.02.01 12:59:00 AAPL 100    24000     
2019.02.01 15:59:00 AAPL 1000   24000     
2019.02.02 12:59:00 AAPL 5000   21000     
2019.02.02 15:59:00 AAPL 0      21000  
编辑第二个示例-

您可以使用fby,这将允许您添加额外的约束,为每个sym/日期更新12:59或15:59的最大时间记录:

q)update volume:volume-closingvol from t where (time=15:59:00)|time=12:59:00,volume>=closingvol,time=(max;time)fby ([]date;sym)
date       time     sym  volume closingvol
------------------------------------------
2019.02.01 12:59:00 AAPL 100    24000     
2019.02.01 12:59:00 BAC  1000   12000     
2019.02.01 15:59:00 AAPL 1000   24000     
2019.02.01 15:59:00 BAC  0      12000     
2019.02.02 12:59:00 AAPL 5000   21000     
2019.02.02 12:59:00 BAC  20000  11000     
2019.02.02 15:59:00 AAPL 0      21000     
2019.02.02 15:59:00 BAC  1000   11000    
那个?在这里可能有用:

update volume:?[time in 12:59:00 15:59:00;volume-closingvol;volume] from t where vol>=closingvol

第一个参数需要一个布尔列表-在12:59:00 15:59:00检查时创建,并应用第一个条件删除closingvol,其中该列表返回True,else应用第二个条件,使卷保持原样。

您的示例显示,两次的卷都可能大于关闭卷-同一日期的12:59:00 15:59:00,符号对。这就是为什么条件“vol>=closingvol”给出的答案不正确,您在示例中使用了该答案,在您的帖子的其他答案中也使用了该答案

以下解决方案将基于以下假设:

所有日期、符号组合都有两个时间-12:59:00 15:59:00。 数据是按时间排序的。 即使上述假设在实际场景中不成立,也很容易更改下面的查询以根据该假设工作

  q) t:([]date:2019.02.01 2019.02.01 2019.02.02 2019.02.02 2019.02.02 2019.02.02 2019.02.01 2019.02.01;time:12:59:00 15:59:00 12:59:00 15:59:00 12:59:00 15:59:00 12:59:00 15:59:00;sym:`AAPL`AAPL`AAPL`AAPL`BAC`BAC`BAC`BAC;volume:100 25000 26000 0 20000 12000 13000 0; closingvol: 24000 24000 21000 21000 11000 11000 12000 12000)

  q) update volume:{?[0=x 1;(x[0]-y[0]),x 1;x[0],x[1]-y[1]]}[volume;closingvol] by date,sym from t where  time in (12:59:00 15:59:00)
或相同查询的其他版本:

  q) update volume: volume-closingvol*(0 1;1 0)0=volume 1 by date,sym from t where  time in (12:59:00 15:59:00)

您还可以通过使用volume和closingvol替换x和y来避免查询中的lambda函数。我用这种方法把它缩小了一点。

谢谢Jomahony——但我认为这并不能解决问题。我用一个例子更新了这个问题,说明这似乎不起作用。
date       time     sym  volume closingvol
------------------------------------------
2019.02.01 12:59:00 AAPL 100    24000     
2019.02.01 15:59:00 AAPL 1000   24000     
2019.02.02 12:59:00 AAPL 5000   21000     
2019.02.02 15:59:00 AAPL 0      21000     
2019.02.02 12:59:00 BAC  20000  11000     
2019.02.02 15:59:00 BAC  1000   11000     
2019.02.01 12:59:00 BAC  1000   12000     
2019.02.01 15:59:00 BAC  0      12000