Kdb 双-三重循环,使用长度不同的向量索引

Kdb 双-三重循环,使用长度不同的向量索引,kdb,Kdb,我花了太多的时间来搜索文档或适当的示例,但都无济于事。 请有人告诉我如何处理这个问题 假设我有以下购买股票的订单表。他们将在指定的时间结束 orders:([] seq:10*1+til 5; ID:5#`softbank;start:11:00 10:00 09:00 13:30 18:00;end:13:30 12:30 11:30 14:30 19:00) 出于某种原因,我希望在给定的开始和结束时间范围内的子时间间隔内找到最大的活订单数(假设没有交易)。这是测试OOP实现技能的一个非常典

我花了太多的时间来搜索文档或适当的示例,但都无济于事。 请有人告诉我如何处理这个问题

假设我有以下购买股票的订单表。他们将在指定的时间结束

orders:([] seq:10*1+til 5; ID:5#`softbank;start:11:00 10:00 09:00 13:30 18:00;end:13:30 12:30 11:30 14:30 19:00)
出于某种原因,我希望在给定的开始和结束时间范围内的子时间间隔内找到最大的活订单数(假设没有交易)。这是测试OOP实现技能的一个非常典型的问题。。。在与O(nlogn)序列中的开始时间匹配的if-else条件下进行排序和扣除/添加


我只能考虑迭代两个
start
/
end
循环,其中包含if条件。我还读到了一篇文章,其中提到,状态循环可以是原子变量,也可以是相同长度的向量。但语言不可能如此有限。是否有人能教我或与我分享易于理解的链接…

如果我正确理解了这个问题,您会试图找出每个时间窗口内有多少订单处于活动状态(即重叠)?如果是这样的话,您可以这样实现:

orders:([] seq:10*1+til 5; ID:5#`softbank;start:11:00 10:00 09:00 13:30 18:00;end:13:30 12:30 11:30 14:30 19:00);

/to get the count
q)update active:sum each (start<\:end)&end>\:start from orders
seq ID       start end   active
-------------------------------
10  softbank 11:00 13:30 3
20  softbank 10:00 12:30 3
30  softbank 09:00 11:30 3
40  softbank 13:30 14:30 1
50  softbank 18:00 19:00 1

/to get the seq numbers
q)update active:seq where each (start<\:end)&end>\:start from orders
seq ID       start end   active
---------------------------------
10  softbank 11:00 13:30 10 20 30
20  softbank 10:00 12:30 10 20 30
30  softbank 09:00 11:30 10 20 30
40  softbank 13:30 14:30 ,40
50  softbank 18:00 19:00 ,50
orders:([]seq:10*1+til 5;ID:5#`软银;开始:11:00 10:00 09:00 13:30 18:00;结束:13:30 12:30 11:30 14:30 19:00);
/数一数
q) 更新活动:对每个进行求和(开始\:从订单开始
seq ID开始结束活动
-------------------------------
10软银11:00 13:30 3
20软银10:00 12:30 3
30软银09:00 11:30 3
40软银13:30 14:30 1
50软银18:00 19:00 1
/获取序号
q) 更新活动:seq where each(开始\:从订单开始
seq ID开始结束活动
---------------------------------
10软银11:00 13:30 10 20 30
20软银10:00 12:30 10 20 30
30软银09:00 11:30 10 20 30
40软银13:30 14:30,40
50软银18:00 19:00,50
你没有找到太多关于循环/索引/迭代的文档或例子,是因为kdb不是为这种方法设计的

编辑-基于评论的其他方法

/intervals
iv:distinct asc raze orders`start`end;

/overlaps
update o:{1_{y,x}prior iv where(iv>=x)&iv<=y}'[start;end] from `orders;

/intersections
q)update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
-------------------------------------------------------------------------------------
10  softbank 11:00 13:30 (11:00 11:30;11:30 12:30;12:30 13:30)!(10 20 30;10 20;,10)
20  softbank 10:00 12:30 (10:00 11:00;11:00 11:30;11:30 12:30)!(20 30;10 20 30;10 20)
30  softbank 09:00 11:30 (09:00 10:00;10:00 11:00;11:00 11:30)!(,30;20 30;10 20 30)
40  softbank 13:30 14:30 ,13:30 14:30!,,40
50  softbank 18:00 19:00 ,18:00 19:00!,,50

/if you want to know the counts
q)@[;`o;count'']update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
--------------------------------------------------------------------
10  softbank 11:00 13:30 (11:00 11:30;11:30 12:30;12:30 13:30)!3 2 1
20  softbank 10:00 12:30 (10:00 11:00;11:00 11:30;11:30 12:30)!2 3 2
30  softbank 09:00 11:30 (09:00 10:00;10:00 11:00;11:00 11:30)!1 2 3
40  softbank 13:30 14:30 ,13:30 14:30!,1
50  softbank 18:00 19:00 ,18:00 19:00!,1

/if you want to see where the maximum overlap occurred
q)@[;`o;{#[;x]where c=max c:count each x}']update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
-----------------------------------------------
10  softbank 11:00 13:30 ,11:00 11:30!,10 20 30
20  softbank 10:00 12:30 ,11:00 11:30!,10 20 30
30  softbank 09:00 11:30 ,11:00 11:30!,10 20 30
40  softbank 13:30 14:30 ,13:30 14:30!,,40
50  softbank 18:00 19:00 ,18:00 19:00!,,50
/间隔
iv:不同的asc raze命令“开始”和“结束”;
/重叠

更新o:{1_{y,x}在iv之前,其中(iv>=x)&我认为这个问题是在给定的时间间隔内提出的。在11:00-15:00之间有11到12、12到1、1到2、2到3。这类似于在给定到达/离开时间顺序的情况下计算最大客人的时间范围。你是如何循环这些时间范围的?感谢更新和评论。这是正确的。。如何在每个给定时间段的子间隔内返回最大相交顺序?这就是我循环思考的原因。我只看到从所选行+01:00到结束的迭代。好的。您的问题中没有提到1小时的子间隔。请编辑您的原始问题以说明这一点,并显示您预期的最终结果l结果太多了,无法解释抱歉,如果你一步一步地使用code.kx作为查找工具,那么你应该能够理解它。我的第一个答案已经给出了最大交集!!!!如果你需要知道最大交集何时出现,请参阅我的上面的编辑
/intervals
iv:distinct asc raze orders`start`end;

/overlaps
update o:{1_{y,x}prior iv where(iv>=x)&iv<=y}'[start;end] from `orders;

/intersections
q)update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
-------------------------------------------------------------------------------------
10  softbank 11:00 13:30 (11:00 11:30;11:30 12:30;12:30 13:30)!(10 20 30;10 20;,10)
20  softbank 10:00 12:30 (10:00 11:00;11:00 11:30;11:30 12:30)!(20 30;10 20 30;10 20)
30  softbank 09:00 11:30 (09:00 10:00;10:00 11:00;11:00 11:30)!(,30;20 30;10 20 30)
40  softbank 13:30 14:30 ,13:30 14:30!,,40
50  softbank 18:00 19:00 ,18:00 19:00!,,50

/if you want to know the counts
q)@[;`o;count'']update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
--------------------------------------------------------------------
10  softbank 11:00 13:30 (11:00 11:30;11:30 12:30;12:30 13:30)!3 2 1
20  softbank 10:00 12:30 (10:00 11:00;11:00 11:30;11:30 12:30)!2 3 2
30  softbank 09:00 11:30 (09:00 10:00;10:00 11:00;11:00 11:30)!1 2 3
40  softbank 13:30 14:30 ,13:30 14:30!,1
50  softbank 18:00 19:00 ,18:00 19:00!,1

/if you want to see where the maximum overlap occurred
q)@[;`o;{#[;x]where c=max c:count each x}']update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
-----------------------------------------------
10  softbank 11:00 13:30 ,11:00 11:30!,10 20 30
20  softbank 10:00 12:30 ,11:00 11:30!,10 20 30
30  softbank 09:00 11:30 ,11:00 11:30!,10 20 30
40  softbank 13:30 14:30 ,13:30 14:30!,,40
50  softbank 18:00 19:00 ,18:00 19:00!,,50