如何使用自定义组对kdb +中的数据进行分组?

时间:2013-05-07 16:14:56

标签: grouping kdb

我有一张表(allsales),其中包含一段时间(sale_time)列。我想按sale_time对数据进行分组。但我希望能够解决这个问题。对于时间在00:00:00-03:00:00之间的任何数据应该组合在一起,03:00:00-06:00:00应该组合在一起,依此类推。有没有办法写这样的查询?

2 个答案:

答案 0 :(得分:4)

xbar对于舍入到区间值非常有用,例如

q)5 xbar 1 3 5 8 10 11 12 14 18
0 0 5 5 10 10 10 10 15

我们可以使用它将行分组为时间组,例如:

q)s:([] t:13:00t+00:15t*til 24; v:til 24)

q)s
t            v
--------------
13:00:00.000 0
13:15:00.000 1
13:30:00.000 2
13:45:00.000 3
14:00:00.000 4
14:15:00.000 5
..

q)select count i,sum v by xbar[`int$03:00t;t] from s
t           | x  v
------------| ------
12:00:00.000| 8  28
15:00:00.000| 12 162
18:00:00.000| 4  86

“by xbar [`int $ 03:00t; t]”将时间列t舍入到最接近的三小时值,然后将其用作组合。

答案 1 :(得分:0)

实现相同结果的方法还有很多。

q)select count i , sum v by t:01:00u*3 xbar t.hh  from s
q)select count i , sum v by t:180 xbar t.minute  from s
t    | x  v
-----| ------
12:00| 8  28
15:00| 12 162
18:00| 4  86

但是在所有情况下,如果表中存在date列,请小心,否则不同日期的相同时间窗口将产生错误的结果。

q)s:([] d:24#2013.05.07 2013.05.08;   t:13:00t+00:15t*til 24; v:til 24)
q)select count i , sum v by d, t:180 xbar t.minute  from s
d          t    | x v
----------------| ----
2013.05.07 12:00| 4 12
2013.05.07 15:00| 6 78
2013.05.07 18:00| 2 42
2013.05.08 12:00| 4 16
2013.05.08 15:00| 6 84
2013.05.08 18:00| 2 44