一、题目
有用户点击日志记录表 user_click_log,包含user_id(用户ID), click_time(点击时间),请查询出连续点击三次以上的用户数,
连续点击三次:指点击记录中同一用户连续点击,中间无其他用户点击;
二、思路
看下图总结一下规律:如果一个用户连续点击中间没有其他用户,那么全局序号(global_rank)和用户序号(user_rank)的差值相同。见下面图中的两个红框,分别是用户1和用户3连续点击的情况。

三、解答
with tab_detail as (
-- 明细数据
select
user_id,
click_time,
global_rank, -- 按时间全局排序
user_rank, -- 用户排序
global_rank - user_rank as diff_val -- 排序差值
from (
select
user_id,
click_time,
rank() over(order by click_time) global_rank, -- 按时间全局排序
rank() over(partition by user_id order by click_time) user_rank -- 用户排序
from user_click_log
) t11
order by click_time
)
select
distinct user_id
from (
-- 每个用户每个差值的数量:如果数量>=3则表示连续点击了3次以上
select
user_id,
diff_val,
count(*) cnt
from tab_detail
group by user_id,
diff_val
) t21
where cnt >= 3结果:

数据
# 建表
-- 建表语句
create table user_click_log (
user_id bigint,
click_time bigint
)
stored as parquet
;
--插入数据
insert into user_click_log (user_id, click_time) values
(1,1736337600),
(2,1736337670),
(1,1736337710),
(1,1736337715),
(1,1736337715),
(1,1736337750),
(2,1736337760),
(3,1736337820),
(3,1736337840),
(3,1736337850),
(3,1736337910),
(4,1736337915)注:题目获取自网络
评论