【问题标题】:Aggregated Materialized View聚合物化视图
【发布时间】:2021-08-10 16:43:28
【问题描述】:

我正在构建一个 KPI 查看器,我必须在其中显示 5-6 年期间的某些汇总值。由于我对 CH 还很陌生,我非常依赖阅读文档,但有时找不到示例。

CREATE TABLE test1.table1
(
    seriesId Int32,
    amount Int64, 
    txt varchar(100)
) ENGINE = MergeTree()
order by (seriesId)
;

现在的目标是获得一个物化视图

  1. 系列中所有金额的总和
  2. 系列中所有金额的计数(不同)
  3. 分钟(数量)
  4. 最大(数量)

我已经想出了如何使用 SummingMergeTree 来解决 SUM 和计数部分(如果我仅为这 2 个聚合值创建单独的视图),但我无法计算出最小值和最大值。我得到的每个解决方案在视图上都有重复项。对于 SummingMergeTree,也可能存在重复项但它们最终会被合并,但对于 aggregatingMergeTree,我似乎无法将它们合并。

原始表有 aprox。 40 亿行

我的尝试是这样做

CREATE MATERIALIZED VIEW test1.MV1
ENGINE=AggregatingMergeTree() 
ORDER BY seriesId
POPULATE
AS 
SELECT  
    seriesId ,
    sum(amount) as amt ,
    min(amount) as minAmt,
    max(amount) as maxAmt
from test1.table1 t 
group by seriesId 

现在这并不像我希望的那样起作用。

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    试试这个:

    CREATE MATERIALIZED VIEW test1.MV1
    (
      seriesId Int32,
      sumAmt SimpleAggregateFunction(sum, Int64),
      minAmt SimpleAggregateFunction(min, Int64),
      maxAmt SimpleAggregateFunction(max, Int64),
      uniqAmt AggregateFunction(uniqExact, Int64)
    )
    ENGINE=AggregatingMergeTree() 
    ORDER BY seriesId 
    AS 
    SELECT  
        seriesId ,
        sum(amount) sumAmt,
        min(amount) minAmt,
        max(amount) maxAmt,
        uniqExactState(amount) uniqAmt
    from test1.table1 t 
    group by seriesId 
    
    select seriesId, sum(sumAmt), min(minAmt), max(maxAmt), uniqExactMerge(uniqAmt)
    from test1.MV1
    /* where seriesId = ..  */
    group by seriesId
    

    【讨论】:

    • 嗨,我又遇到了类似的问题,但似乎聚合得不好。如果我有一个包含增量插入的表,假设每天 20 次,并且我希望将帐户余额(财务)汇总到所有这些事务插入中,那么我没有得到正确的值。
    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 2021-07-21
    • 2014-10-05
    • 2021-08-10
    • 1970-01-01
    • 2022-11-12
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多