KDB滚动总和

kdb

703 观看

4回复

1527 作者的声誉

我有桌子

t:flip `date`sym`ts`qty!(`d1`d1`d1`d1`d1`d1`d2;`s1`s1`s2`s1`s1`s2`s1;`t1`t1`t2`t3`t4`t5`t1;-100 -100 200 200 500 -300 -400)

date    sym   ts     qty
d1       s1   t1    -100
d1       s1   t1    -100
d1       s2   t2     200
d1       s1   t3     200
d1       s1   t4     500
d1       s2   t5    -300
d2       s1   t1    -400

我想获得当天同一时刻每个符号的累计数量总和

date    sym   ts     qty   cumsum
d1       s1   t1    -100     -200 // -100 - 100
d1       s2   t2     200      200 //  200
d1       s1   t3     200        0 // -100 -100 + 200
d1       s1   t4     500      500 // -100 -100 + 200 + 500
d1       s2   t5    -300     -100 //  200 - 300
d2       s1   t1    -400     -400 // -400 (date is d2)

我尝试使用

select sums qty by date, ts, sym from t

但是与此同时,我只设法将具有相同键datets'sym的行折叠到列表中,但没有给我滚动的总和。有什么建议么?

编辑:所以,基本上,我想附加一列来显示从此查询中获取的值

select sum qty from t where sym =`symbol_of_this_row, ts <= ts_of_this_row, date = _date_of_this_row
作者: chrise 的来源 发布者: 2017 年 9 月 15 日

回应 4


1

80 作者的声誉

我可能会误解您的问题..所以您想要与datesym`timestamp 相匹配的行的累积总和,是吗?

这个怎么样:

    t: update cumsum:sums qty by date, sym, ts from t
    // for the sake of 'pretty view' sort by `date`sym`ts 
    `date`sym`ts xasc t

编辑:我确定您可以通过执行功能更新(http://www.timestored.com/kdb-guides/functional-queries-dynamic-sql)使它更漂亮。我只是自己编写了一些函数来向您展示基本思想。1.传递表格和表格的每一行。

    temp:{[idx; tbl]
         row: first select from tbl where i = idx;
         : last update cumulative:sums qty from (select from tbl where date=row[`date], sym=row[`sym], ts<=row[`ts]);
         };
  1. 通过每个权利(/)更新表格

     temp2:{[tbl; idx]
        row: first select from tbl where i = idx;
        :tbl lj (`date`sym`ts xkey enlist last update cumulative:sums qty from  (select from tbl where date=row[`date],sym=row[`sym],ts<=row[`ts]));
        };
    

对于#1,您可以致电:

tbl: {: temp[y; x] }[; tbl] each til count tbl

对于#2,您可以这样调用:

tbl: temp2/[tbl; til count tbl]
作者: jeonw 发布者: 2017 年 9 月 15 日

2

56 作者的声誉

决定

这应该做您想要的:

//Ascend by date and time to make sure that result sets match
`date`ts xasc 
    //Compute cumulative sums by date, sym, timestamp
    update sums cumul by date,sym from 
        //Make sure that there is a single qty for each timestamp
        select cumul:sum qty by date,sym,ts from t
作者: BrenC 发布者: 2017 年 9 月 15 日

1

308 作者的声誉

这可能有用,尽管有点难看。

`date`ts xasc 0! / sort and unkey
    update cumsum:sums qty by date, sym from 
        select sum qty by date, sym, ts from t

哪个产生;

date sym ts qty  cumsum
-----------------------
d1   s1  t1 -200 -200  
d1   s2  t2 200  200   
d1   s1  t3 200  0     
d1   s1  t4 500  500   
d1   s2  t5 -300 -100  
d2   s1  t1 -400 -400  

注意第一行的数量与您的示例不同。这是因为在运行累积总和之前,我必须在同一ts内聚合数据。可能有一种隐式地执行此操作的方法,但现在不会出现。

作者: Dónal Lynch 发布者: 2017 年 9 月 15 日

0

303 作者的声誉

如果行按时间顺序排列,则无需对表进行排序:by子句将执行您想要的操作。

  1. 用于通过和update计算cumsumdatets
  2. 选择last的价值cumsumdatetssym
  3. 取出钥匙

q)0!select last cumsum by date,ts,sym from update cumsum: sums qty by date,sym from t
date ts sym cumsum
------------------
d1   t1 s1  -200
d1   t2 s2  200
d1   t3 s1  0
d1   t4 s1  500
d1   t5 s2  -100
d2   t1 s1  -400

如果您需要参数化任何一个(即,将列名作为参数传递),则需要使用函数形式

q)u:![t;();`date`sym!`date`sym;(enlist`cumsum)!enlist(sums;`qty)]
q)0!?[u;();`date`ts`sym!`date`ts`sym;(enlist`cumsum)!enlist(last;`cumsum)]

Q for Mortals的更多内容:第9节。查询

作者: SJT 发布者: 2017 年 9 月 20 日
32x32