ClickHouse按Nullable字段分组聚合结果异常问题排查
ClickHouse Nullable(DateTime)分组计数异常问题解决
可能的原因及排查步骤
插入数据并非真正的NULL
先验证数据是否正确插入,执行以下SQL确认每一行的vers_to是否为NULL:SELECT vers_to, isNull(vers_to) AS is_null FROM test_null_dt;若
is_null列中对应行的值不为1,说明你插入的不是真正的NULL(比如误写为字符串'null'、或字段设置了默认值)。重新插入正确的NULL值示例:INSERT INTO test_null_dt (id, vers_to) VALUES (1, NULL), (2, NULL), (3, NULL), (4, '2024-01-01 00:00:00'), (5, '2024-01-02 00:00:00'), (6, '2024-01-03 00:00:00');分组SQL逻辑错误
检查你的分组语句是否误将NULL转换为非NULL值,比如使用了ifNull(vers_to, now())、coalesce(vers_to, ...)这类函数,导致NULL被替换为具体DateTime值,全部归入非NULL分组。正确的分组语句应为:SELECT vers_to, sum(1) AS count FROM test_null_dt GROUP BY vers_to;也可以用
count(*)替代sum(1),结果一致:SELECT vers_to, count(*) AS count FROM test_null_dt GROUP BY vers_to;版本bug影响
你使用的ClickHouse 24.1.4.20版本可能存在Nullable(DateTime)分组的已知问题。尝试升级到该分支的较新版本(如24.1.8+),或切换到稳定分支(如23.8)验证问题是否消失。
预期正确结果
当所有操作正确时,查询结果应为:
┌──────────vers_to─┬─count─┐ │ ᴺᵁᴸᴸ │ 3 │ │ 2024-01-01 00:00:00 │ 1 │ │ 2024-01-02 00:00:00 │ 1 │ │ 2024-01-03 00:00:00 │ 1 │ └──────────────────┴───────┘
若非NULL的vers_to值相同,会合并为一行,count为3。
内容的提问来源于stack exchange,提问作者Aleksey N Yakushev
相关产品推荐
相关产品推荐

