仅将公式应用于当前行和上一行(Q/KDB)

仅将公式应用于当前行和上一行(Q/KDB),kdb,q-lang,Kdb,Q Lang,我有一个公式,我想逐行应用,这样计算中只包括任何给定行上的当前行和以前的行。考虑这些数据: data:([]dt:2017.01.05D19:45:00.238248239 2017.01.05D20:46:00.282382392 2017.01.05D21:47:00.232842342 2017.01.05D22:48:00.835838442 2017.01.05D20:49:00.282382392;sym:`AAPL`GOOG`AAPL`BBRY`GOOG;price:101.20

我有一个公式,我想逐行应用,这样计算中只包括任何给定行上的当前行和以前的行。考虑这些数据:

data:([]dt:2017.01.05D19:45:00.238248239 2017.01.05D20:46:00.282382392 2017.01.05D21:47:00.232842342 2017.01.05D22:48:00.835838442 2017.01.05D20:49:00.282382392;sym:`AAPL`GOOG`AAPL`BBRY`GOOG;price:101.20 800.20 102.30 2.20 800.50;shares:500 100 500 900 100)

data:
dt                            sym    price   shares
2017.01.05D19:45:00:238248239 AAPL   101.20  500
2017.01.05D20:46:00:282382392 GOOG   800.20  100
2017.01.05D21:47:00:232842342 AAPL   102.30  500
2017.01.05D22:48:00:835838442 BBRY     2.20  900
2017.01.05D20:49:00:282382392 GOOG   800.50  100
公式
select sum price from data,其中i=(last;i)fby sym
将产生我需要的结果,但它只会产生1个数据点。我需要在数据集的每一行进行计算


Scan(\)应用此行为,但不幸的是,我不知道在使用select语句时如何执行此操作。

不完全确定您想要什么,但以下使用每个
sym
的最新
价格
来计算总和
rp

q)update rp:sum each @\[()!();sym;:;price] from data
dt                            sym  price shares rp
-----------------------------------------------------
2017.01.05D19:45:00.238248239 AAPL 101.2 500    101.2
2017.01.05D20:46:00.282382392 GOOG 800.2 100    901.4
2017.01.05D21:47:00.232842342 AAPL 102.3 500    902.5
2017.01.05D22:48:00.835838442 BBRY 2.2   900    904.7
2017.01.05D20:49:00.282382392 GOOG 800.5 100    905

最终数据点的答案与上面给出的相同。

您还可以获得每个指数的最后价格,如下所示:

{[x;y] exec sum price from x where i<=y, i=(last;i) fby sym}[data]each til count data
101.2 901.4 902.5 904.7 905

{[x;y]x的exec sum price,其中我指的是k4列表框,但同样的建议也适用于StackOverflow——一个可执行的例子比上面的表格快照更有价值,你的预期结果是什么?目前还不清楚你在寻找什么。有关写作问题的建议,请参阅本页ide打开。最好编辑原始问题以包含示例输出,而不是将其添加为注释。问题的格式选项比注释要好得多。这回答了我的问题。我需要的解决方案将公式修改为:
update rp:sum each get each{x,(!).(),/:(y;z)}\[()!();sym;price*shares]从data1
中,您可以从中删除
获取每个
,以便以后使用。您还可以将字典创建简化为
{x[y]:z;x}
{@[x;y;:;z]}