【问题标题】:ClickHouse: Efficient way to aggregate data by different time ranges atClickHouse:按不同时间范围聚合数据的有效方法
【发布时间】:2020-03-22 04:22:36
【问题描述】:

我需要聚合不同时间段的时间序列数据(具有平均函数),例如:

  • 今天

  • 过去 X 天

  • 上周末

  • 本周

  • 过去 X 周

  • 本月

  • 列表项

    等等……

Q1:是否可以在GROUP BY 语句中完成,或者至少在单个查询中完成?

Q2:我需要任何物化视图吗?

该表由Month分区并由UserID分片

所有查询都在UserID(单个分片)

【问题讨论】:

    标签: group-by clickhouse


    【解决方案1】:

    使用 ROLLUP 分组

    create table xrollup(metric Int64, b date, v Int64 ) engine=MergeTree partition by tuple() order by tuple();
    insert into xrollup values (1,'2018-01-01', 1), (1,'2018-01-02', 1), (1,'2018-02-01', 1), (1,'2017-03-01', 1);
    insert into xrollup values (2,'2018-01-01', 1), (2,'2018-02-02', 1);
    
    SELECT metric, toYear(b) y, toYYYYMM(b) m, SUM(v) AS val
    FROM   xrollup
    GROUP BY metric, y, m  with ROLLUP
    ORDER BY metric, y, m 
    
    ┌─metric─┬────y─┬──────m─┬─val─┐
    │      0 │    0 │      0 │   6 │  overall
    │      1 │    0 │      0 │   4 │  overall by metric1
    │      1 │ 2017 │      0 │   1 │  overall by metric1 for 2017
    │      1 │ 2017 │ 201703 │   1 │  overall by metric1 for march 2017
    │      1 │ 2018 │      0 │   3 │
    │      1 │ 2018 │ 201801 │   2 │
    │      1 │ 2018 │ 201802 │   1 │
    │      2 │    0 │      0 │   2 │
    │      2 │ 2018 │      0 │   2 │
    │      2 │ 2018 │ 201801 │   1 │
    │      2 │ 2018 │ 201802 │   1 │
    └────────┴──────┴────────┴─────┘
    

    【讨论】:

    • 对于不可为空的列的 ROLLUP 工作服,我如何才能收到 null 而不是零? (零值与 ROLLUP 整体零冲突)
    • 现在只使用强制转换为可空cast(metric, 'Nullable(Int64)'), cast(toYear(b), 'Nullable(Int32)') y
    • 那么带有预聚合 -State 的 MV 呢?在这种情况下可以提供帮助吗?
    • MV - SummingMergeTree(具有天粒度)将有所帮助(在这种情况下 -state 是不必要的——它只需要平面总和)。 Group by 会更快,因为 SummingMergeTree 的行数会更少。
    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多