clickhouse高阶函数应用(二、retention计算留存数)

文章目录

前言

clickhouse提供retention(cond1, cond2, …)函数方便计算用户留存率,当然也可以应用在其他需求上。

准备

  • 建表
CREATE TABLE login_log -- 用户登录日志
(
uid Int32,  -- 用户唯一id
login_time DateTime -- 用户登录时间
)  
ENGINE = MergeTree PARTITION BY uid order by uid;
  • 导数
-- 随意发挥就好
insert into login_log 
values
(1101,toDateTime('2019-06-21 22:00:00')),
(1101,toDateTime('2019-06-20 22:00:00')),
(1101,toDateTime('2019-06-19 22:00:00')),
(1101,toDateTime('2019-06-17 22:00:00')),
(1101,toDateTime('2019-06-16 22:00:00')),
(1101,toDateTime('2019-06-21 22:00:00')),
(1101,toDateTime('2019-06-21 23:00:00')),
(1101,toDateTime('2019-06-20 23:00:00')),
(1101,toDateTime('2019-06-19 23:00:00')),
(1101,toDateTime('2019-06-17 23:00:00')),
(1101,toDateTime('2019-06-16 23:00:00')),
(1101,toDateTime('2019-06-21 23:00:00')),
(4101,toDateTime('2019-06-20 22:00:00')),
(4101,toDateTime('2019-06-19 22:00:00')),
(4101,toDateTime('2019-06-17 22:00:00')),
(4101,toDateTime('2019-06-16 22:00:00')),
(2201,toDateTime('2019-06-21 22:00:00')),
(2201,toDateTime('2019-06-20 22:00:00')),
(2201,toDateTime('2019-06-21 23:00:00')),
(2201,toDateTime('2019-06-20 23:00:00')),
(3301,toDateTime('2019-06-21 22:00:00')),
(3301,toDateTime('2019-06-19 22:00:00')),
(3301,toDateTime('2019-06-18 23:00:00')),
(3301,toDateTime('2019-06-17 23:00:00')),
(3301,toDateTime('2019-06-16 23:00:00')),
(3301,toDateTime('2019-06-15 23:00:00'));

查询

-- 查询用户在2019-06-17 至 2019-06-21 号登录情况
select 
uid,
retention(
    toDate(login_time) = '2019-06-21',
    toDate(addDays(login_time,1)) = '2019-06-21',
    toDate(addDays(login_time,2)) = '2019-06-21',
    toDate(addDays(login_time,3)) = '2019-06-21',
    toDate(addDays(login_time,4)) = '2019-06-21'
    ) as r
from login_log ll 
group by ll.uid

结果:r数组表示每天登录情况,1/0 => 登录/未登录,
-----------------
┌──uid─┬─r───────────┐
│ 1101 │ [1,1,1,0,1] │
│ 2201 │ [1,1,0,0,0] │
│ 3301 │ [1,0,1,1,1] │
│ 4101 │ [0,0,0,0,0] │
└──────┴─────────────┘
4 rows in set. Elapsed: 0.014 sec. 

值得注意的是uid=4101的用户,明明有登录记录,但数据全是0。这是因为当retention(cond1, cond2, …)函数中,第一个表达cond1如果不满足,那么后面所有的结果就都是0。
4101的用户2019-06-21当天没登录,所有他后面的数据全部为0,那如果不想出现这种情况怎么做了,既然cond是条件判断,所有只需要将第一个表达式cond1直接设置成1即可。

结论

看完retention函数计算出的数据结构后,我们知道就是一个Array类型字段,那么就可以根据自身需求充分利用了。比如计算2019-06-21当天的用户量就是sum(r[1])即可。

发布了62 篇原创文章 · 获赞 33 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/yyoc97/article/details/93376105