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:如何在另一列中找到高于日期的数组中的最小日期?