首页 > 解决方案 > Clickhouse - 如何按日期在数组中聚合超出此日期的数据?

问题描述

我需要汇总当前行中高于特定值的所有数据,在我的情况下是日期。

我有以下数据:

date       | values 

2010-01-01 | value1
2010-01-02 | value2
2010-01-03 | value3

具体来说,类似于以下输出:

date       | sums

2010-01-01 | [value1, value2, value3]
2010-01-02 | [value2, value3]
2010-01-03 | [value3]

有可能吗?

标签: clickhouse

解决方案


试试这些查询:

具有相同日期的行重复的常见情况:

SELECT result.1 date, result.2 values
FROM (
  SELECT 
    groupArray((date, values)) data,
    arrayMap(
      (x, index) -> (x.1, arrayFlatten(arrayMap(y -> y.2, arraySlice(data, index)))),
      data, 
      arrayEnumerate(data)) result_as_array,
    arrayJoin(result_as_array) result
  FROM (
    SELECT date, groupArray(value) values
    FROM (        
      SELECT data.1 date, data.2 value
      FROM (  
        /* emulate the original data */
        SELECT arrayJoin(
        [('2010-01-02', 'value2-1'),
        ('2010-01-03', 'value3-2'),
        ('2010-01-01', 'value1-1'),
        ('2010-01-02', 'value2-2'),
        ('2010-01-03', 'value3-1')]) data))
    GROUP BY date
    ORDER BY date))
/* result
┌─date───────┬─values───────────────────────────────────────────────────┐
│ 2010-01-01 │ ['value1-1','value2-1','value2-2','value3-2','value3-1'] │
│ 2010-01-02 │ ['value2-1','value2-2','value3-2','value3-1']            │
│ 2010-01-03 │ ['value3-2','value3-1']                                  │
└────────────┴──────────────────────────────────────────────────────────┘
*/

同一日期不重复时的具体情况:

SELECT result.1 date, result.2 values
FROM (
    SELECT 
        groupArray((date, value)) data,
        arrayMap(
            (x, index) -> (x.1, arrayMap(y -> y.2, arraySlice(data, index))), 
            data, 
            arrayEnumerate(data)) result_as_array,
        arrayJoin(result_as_array) result
    FROM (        
        SELECT data.1 date, data.2 value
        FROM (
            /* emulate the original data */
            SELECT arrayJoin(
                [('2010-01-02', 'value2'),
                ('2010-01-01', 'value1'),
                ('2010-01-03', 'value3')]) data)
        ORDER BY date)
    )
/* result
┌─date───────┬─values───────────────────────┐
│ 2010-01-01 │ ['value1','value2','value3'] │
│ 2010-01-02 │ ['value2','value3']          │
│ 2010-01-03 │ ['value3']                   │
└────────────┴──────────────────────────────┘
*/

推荐阅读