一、题目

有用户点击日志记录表 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)

注:题目获取自网络