Clickhouse - 如何按日期在数组中聚合超出此日期的数据?

Posted

技术标签:

【中文标题】Clickhouse - 如何按日期在数组中聚合超出此日期的数据?【英文标题】:Clickhouse - How can I aggregate in Array by date data that is beyond this date? 【发布时间】:2020-06-05 18:00:18 【问题描述】:

我需要聚合当前行中高于特定值的所有数据,在我的例子中是日期。

我有以下数据:

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]

有可能吗?

【问题讨论】:

你能提供源数据的例子吗?不仅需要结果吗? @vladimir 有一些修正) 【参考方案1】:

试试这些查询:

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

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']                   │
└────────────┴──────────────────────────────┘
*/

【讨论】:

以上是关于Clickhouse - 如何按日期在数组中聚合超出此日期的数据?的主要内容,如果未能解决你的问题,请参考以下文章

clickhouse:如何在另一列中找到高于日期的数组中的最小日期?

MongoDB 聚合组数组按日期

如何按不同的值将 clickhouse 中的 (value,count) 数组分组?

如何在 PostgreSQL 中按时间间隔聚合行数?

如何在不对股票数据执行聚合功能的情况下按日期分组

如何在 Clickhouse 中使用 group by 间隔 1 小时?