在一个查询中使用类似数据的迷你图按日期分组

Group by date with sparkline like data in the one query

我有类似主机的时间序列数据存储在 ClickHouse table 下一个结构中:

 event_type | event_day        
------------|---------------------
 type_1     | 2017-11-09 20:11:28
 type_1     | 2017-11-09 20:11:25
 type_2     | 2017-11-09 20:11:23
 type_2     | 2017-11-09 20:11:21

table 中的每一行表示 event_type 在日期时间上存在值 1。为了快速评估情况,我需要指出总和(总计)+ 最后七个值(脉冲),如下所示:

 event_type | day        | total | pulse                       
------------|------------|-------|-----------------------------
 type_1     | 2017-11-09 | 876   | 12,9,23,67,5,34,10          
 type_2     | 2017-11-09 | 11865 | 267,120,234,425,102,230,150 

我尝试通过以下方式通过一个请求获取它,但失败了 - 脉冲由相同的值组成:

with
    arrayMap(x -> today() - 7 + x, range(7)) as week_range,
    arrayMap(x -> count(event_type), week_range) as pulse
select
    event_type,
    toDate(event_date) as day,
    count() as total,
    pulse
from database.table
group by day, event_type
 event_type | day        | total | pulse                       
------------|------------|-------|-------------------------------------------
 type_1     | 2017-11-09 | 876   | 876,876,876,876,876,876,876          
 type_2     | 2017-11-09 | 11865 | 11865,11865,11865,11865,11865,11865,11865 

请指出我的错误在哪里以及如何达到要求?

我会考虑在 server-side 上计算 pulse,CH 正好提供所需的数据。


可以使用neighbor-window function:

SELECT
    number,
    [neighbor(number, -7), neighbor(number, -6), neighbor(number, -5), neighbor(number, -4), neighbor(number, -3), neighbor(number, -2), neighbor(number, -1)] AS pulse
FROM
(
    SELECT number
    FROM numbers(10, 15)
    ORDER BY number ASC
)

┌─number─┬─pulse──────────────────┐
│     10 │ [0,0,0,0,0,0,0]        │
│     11 │ [0,0,0,0,0,0,10]       │
│     12 │ [0,0,0,0,0,10,11]      │
│     13 │ [0,0,0,0,10,11,12]     │
│     14 │ [0,0,0,10,11,12,13]    │
│     15 │ [0,0,10,11,12,13,14]   │
│     16 │ [0,10,11,12,13,14,15]  │
│     17 │ [10,11,12,13,14,15,16] │
│     18 │ [11,12,13,14,15,16,17] │
│     19 │ [12,13,14,15,16,17,18] │
│     20 │ [13,14,15,16,17,18,19] │
│     21 │ [14,15,16,17,18,19,20] │
│     22 │ [15,16,17,18,19,20,21] │
│     23 │ [16,17,18,19,20,21,22] │
│     24 │ [17,18,19,20,21,22,23] │
└────────┴────────────────────────┘
select event_type, groupArray(1)(day)[1], arraySum(pulse) total7, groupArray(7)(cnt) pulse
from (
    select
      event_type,
      toDate(event_date) as day,
      count() as cnt
    from database.table
    where day >= today()-30
    group by event_type,day
    order by event_type,day desc 
)
group by event_type 
order by event_type