欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

clickhouse 对查询的结果打上序号 实现row_number()功能

程序员文章站 2022-07-13 11:10:49
...

想象这样一种需求:

用户每天可能会登陆很多次app,每天用户第一次的登陆停留时长和第N次的停留时长是什么关系,是否是线性相关关系?

用户每天收到很多次推送(push),每天用户第一次的点击率和第N次的点击率是否也存在线性相关关系?理清这个关系可以用来指导我们对用户每天push的次数定多少合适

这种统计分析需求需要按照用户的id维度对结果进行排序:例如
clickhouse 对查询的结果打上序号 实现row_number()功能

  • 第一步:

对查到的结果,按照每个用户的登陆时间升序,这样得到了用户的登陆次序。

然后把登陆时间生成数组

select d,
         uid,
         groupArray(datetime) arr_time 
from
(select d, datetime,user_id
		from log
		where d=today()-7
		order by uid desc,datetime asc
		limit 1000
		)
		group by d,uid

得到结果clickhouse 对查询的结果打上序号 实现row_number()功能
第二步:
引入 arrayEnumerate(arr)函数,作用是可以为数组里的每个元素进行排序
返回 Array [1, 2, 3, …, length (arr) ]

和ARRAY JOIN一起使用。它允许在应用ARRAY JOIN后为每个数组计算一次,得到我们想要的顺序

select d,num,arr_time,user_id
from
(select d,
         uid,
         groupArray(datetime) arr_time 
from
(select d, datetime,user_id
		from log
		where d=today()-7
		order by uid desc,datetime asc
		limit 1000
		)
		group by d,uid
)
ARRAY JOIN
arr_time,
arrayEnumerate(arr_time) as num	

clickhouse 对查询的结果打上序号 实现row_number()功能
明白这个原理接着就可以按照序号,group by ,进行分析第N次的停留、点击的相关性

比如下面这样我们就可以拿到每个用户每天收到的第一次、第二次、第三次、第N次 Push_id,根据这个我们能拿到点击率,然后按照次数group by 我们就能看到整体的不同次序的点击率

select d,num,arr_push_id,user_id
from
(select d,
         uid,
         groupArray(push_id) arr_push_id 
from
(select d, datetime,user_id,push_id
		from log
		where d=today()-7
		order by uid desc,datetime asc
		limit 1000
		)
		group by d,uid
)
ARRAY JOIN
arr_push_id,
arrayEnumerate(arr_push_id) as num