背景
Clickhouse是一个性能强悍的OLAP系统,经常被用于用户画像等场景。
在用户画像场景场景中,经常需要对不同年龄段的人群进行计数。比如需要对购买啤酒的男士的年龄分布情况进行分析,而年龄常常需要进行分段,比如划分为18岁以下,18-25岁,25-35岁等年龄段。这种情况下,如何用EMR-Clickhouse优雅的计算出结果呢?
示例
首先模拟一张表,uid代表账户,name代表名字,age代表年龄,为了方便,其他字段省略。
CREATETABLE default.sample( `uid` String, `name` String, `age` UInt64 )ENGINE = MergeTree()ORDERBY uid
然后模拟一些数据,插入表中。
insertinto sample values('ab2','husky',14),('ab1','sam',25),('a4b','jim',19),('44b','jane',29),('pa4b','dany',35),('pgb','james',56),('ppb','leo',76)
通过使用 roundDown(x, [array]) 函数进行查询。
SELECTcount(uid)AS counts, tmp_age AS age FROM(SELECT roundDown(age,[0,18,25,35,45,55,65,75,85,120])AS tmp_age, uid FROM sample )GROUPBY age ORDERBY age ASC
可以看到,查询结果已经分类为0-18岁、18-25岁、25-35岁等区间,可以直接使用工具进行报表展示。
┌─counts─┬─age─┐ │ 1 │ 0 │ │ 1 │ 18 │ │ 2 │ 25 │ │ 1 │ 35 │ │ 1 │ 55 │ │ 1 │ 75 │ └────────┴─────┘
相关资料
可以通过官网看到roundDown相关的使用介绍。
roundAge也具有相似的效果,但是并不灵活。
https://clickhouse.com/docs/en/sql-reference/functions/rounding-functions/
钉钉扫描下方二维码加入EMR-Clickhouse产品交流群一起参与讨论~