【问题标题】:How to group data in kdb+ using customized groups?如何使用自定义组对 kdb+ 中的数据进行分组?
【发布时间】:2013-05-07 16:14:55
【问题描述】:

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

【问题讨论】:

    标签: grouping kdb


    【解决方案1】:

    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。

    【讨论】:

    • 非常感谢,这很有帮助
    【解决方案2】:

    还有其他几种方法可以达到相同的结果。

    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
    

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 2019-01-18
      • 2022-07-31
      • 2023-01-11
      • 2022-07-11
      相关资源
      最近更新 更多