【发布时间】:2013-05-07 16:14:55
【问题描述】:
我有一个表 (allsales),其中有一列时间 (sale_time)。我想按sale_time 对数据进行分组。但我希望能够解决这个问题。例如,时间在00:00:00-03:00:00 之间的任何数据都应该组合在一起,03:00:00-06:00:00 应该组合在一起,依此类推。有没有办法编写这样的查询?
【问题讨论】:
我有一个表 (allsales),其中有一列时间 (sale_time)。我想按sale_time 对数据进行分组。但我希望能够解决这个问题。例如,时间在00:00:00-03:00:00 之间的任何数据都应该组合在一起,03:00:00-06:00:00 应该组合在一起,依此类推。有没有办法编写这样的查询?
【问题讨论】:
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 舍入到最接近的三个小时值,然后将其用作 group by。
【讨论】:
还有其他几种方法可以达到相同的结果。
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
【讨论】: