仅将公式应用于当前行和上一行 (Q/KDB)
Apply formula to current and previous rows only (Q/KDB)
我有一个公式,我想逐行应用,这样只有任何给定行的当前行和上一行都包含在计算中。考虑以下数据:
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 where i=(last;i)fby sym
会产生我需要的结果,但它只会产生 1 个数据点。我需要在数据集的每一行进行计算。
Scan ("\") 应用此行为,但不幸的是我不知道如何在使用 select 语句时执行此操作。
不完全确定你想要什么,但以下使用每个 sym
的最新 price
来计算总和 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
我有一个公式,我想逐行应用,这样只有任何给定行的当前行和上一行都包含在计算中。考虑以下数据:
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 where i=(last;i)fby sym
会产生我需要的结果,但它只会产生 1 个数据点。我需要在数据集的每一行进行计算。
Scan ("\") 应用此行为,但不幸的是我不知道如何在使用 select 语句时执行此操作。
不完全确定你想要什么,但以下使用每个 sym
的最新 price
来计算总和 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