Clickhouse按城市和年龄区间分组透视问题求助
解决ClickHouse按城市+年龄组透视的问题
先修正原查询的语法错误
原查询里的agebetween是拼写错误,正确写法是age between,这是导致类型报错的核心原因——语法错误让ClickHouse无法正确推断agg_age的类型,引发String和UInt8的类型冲突。
实现透视需求(年龄组作为列)
以下两种方法都能实现你要的“每行对应一个城市,各年龄组作为列展示人数”的效果:
方法1:条件聚合(推荐,直观易维护)
SELECT city_name, countIf(age <= 34) AS `18-34`, countIf(age BETWEEN 35 AND 44) AS `35-44`, countIf(age BETWEEN 45 AND 54) AS `45-54`, countIf(age > 54 OR age < 18) AS `Other`, count(*) AS total FROM people WHERE city_name IN ('Chicago', 'Libertyville') GROUP BY city_name
方法2:使用ClickHouse原生pivot函数
适合需要动态指定分组列的场景,需要明确列出所有年龄组:
WITH age_groups AS ( SELECT city_name, CASE WHEN age <= 34 THEN '18-34' WHEN age BETWEEN 35 AND 44 THEN '35-44' WHEN age BETWEEN 45 AND 54 THEN '45-54' ELSE 'Other' END AS agg_age FROM people WHERE city_name IN ('Chicago', 'Libertyville') ) SELECT pivot( city_name, agg_age, count(*), ['18-34', '35-44', '45-54', 'Other'], 0 -- 空值填充为0 ) FROM age_groups GROUP BY city_name
补充说明
原查询的groupArray(agg_age)会返回该城市所有用户的年龄组数组,不符合你要的透视结果。上面两种方法都是直接按城市聚合,计算每个年龄组的人数,结果结构更符合需求。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

