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