【SQL 复健】连续时间题 | 做题记录 002

🥸 2020 抖音春招

问题:有用户行为记录表t_act_records表,包含两个字段:uid(用户ID),imp_date(日期)

计算2020年每个月,每个用户连续签到的最多天数

计算2020年每个月,连续2天都有登陆的用户名单

计算2020年每个月,连续5天都有登陆的用户数

解答:

/* 2020年每个月,每个用户连续签到的最多天数
1. 选定时间范围 Year(impdate)=2020/where impdate between 20200101 and 20201231
2. 连续时间:排序- row_number() over(partition by month(impdate),userid) as rank, 相减- date_sub(impdate,rank) as sign
3. 按月份聚合 group by month(impdate) */
select userid, max(cnt),month(impdate)
from(
  select userid,impdate,date_sub(impdate,rank) as sign,count(1) as cnt
  from(
    select userid,impdate,row_number() over(partition by month(impdate),userid) as rank
    from t_act_records
    where Year(impdate)=2020
    group by userid,impdate
  )
  group by userid,impdate
)
group by userid,month(impdate)

/* 2020年每个月,连续2天都有登陆的用户名单
1. 选定时间范围 Year(impdate)=2020/where impdate between 20200101 and 20201231
2. 连续时间:排序- row_number() over(partition by month(impdate),userid) as rank, 相减- date_sub(impdate,rank) as sign
3. 连续 2 天都登录
4. 按月份聚合 group by month(impdate) */
select userid, month(impdate)
from(
  select userid,impdate,date_sub(impdate,rank) as sign
  from(
    select userid,impdate,row_number() over(partition by month(impdate),userid) as rank
    from t_act_records
    where Year(impdate)=2020
  )
)
group by month(impdate),userid
having count(sign)>=2

/* 2020年每个月,连续5天都有登陆的用户数*/
select count(distinct userid), month(impdate)
from(
  select userid,impdate,date_sub(impdate,rank) as sign
  from(
    select userid,impdate,row_number() over(partition by month(impdate),userid) as rank
    from t_act_records
    where Year(impdate)=2020
  )
)
group by month(impdate),userid
having count(sign)>=5

此类问题的思路:

  1. 按要求排序:row_number() over (partition by xxx order by) as rank
  2. 求时间差:date_sub(date, rank) as diff
  3. 根据题目要求对diff进行限制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值