ClickHouse中AggregatingMergeTree未正确聚合导致查询结果差异问题
导致查询结果存在差异的核心原因如下:
- 时间范围完全不匹配
你用于验证的core_product_tbl查询过滤条件是WHERE minute >= today(),仅统计当天数据;但product_agg_1w视图的过滤条件是取最近14天的数据,两者统计的时间范围差了13天,数值自然对不上。
另外你的物化视图product_agg_mv的写入过滤条件也是WHERE minute >= today(),也就是说product_agg_tbl里只有当天及之后的1分钟粒度数据,更早的历史数据根本没入库,product_agg_1w查询历史时段的结果本来就存在数据缺失。 - 统计粒度不一致
你直接查询core_product_tbl的SQL是按toStartOfMinute(sales_timestamp)分组,输出是1分钟粒度的统计结果;但product_agg_1w是按toStartOfHour(minute)分组,输出是小时粒度的统计结果,两者数据维度完全不对应,直接对比必然存在巨大差异。 - 物化视图存在字段重名逻辑BUG
你的物化视图SQL里,core_product_tbl本身就存在minute字段,你GROUP BY子句给toStartOfMinute(sales_timestamp)起的别名也叫minute,此时SELECT列表里直接写minute会优先读取原表的原生minute字段,而非你分组计算得到的分钟起始时间,最终导致写入product_agg_tbl的minute字段全部错误,后续所有上卷聚合的结果自然全部异常。 - 首末次价格计算存在潜在误差
小时粒度计算整小时最早/最晚成交价时,当前用argMin(first, minute)/argMax(last, minute)的逻辑仅能取到小时内最早/最晚分钟的首尾价格,如果存在分钟数据缺失、时序数据跨分钟偏移的情况,会和直接从原表统计的结果存在误差。
内容的提问来源于stack exchange,提问作者Black
相关产品推荐
相关产品推荐

