面试官:“如何用 SQL 查询每个用户最大连续登录日期?”

原创 Maxim 大数据的奇妙冒险 2022-12-06 08:30

收录于合集

#sql1个

#面试3个

#hive8个

#大数据15个

前言:“如何用 SQL 查询每个用户最大连续登录日期?”

这道题是数据开发面试经常问到的题目,因为其比较考验候选人的 SQL 能力,今天就来简单讲讲其思路。

样例数据如下 login_log:

user_idlogin_time
12022-11-28
12022-12-01
12022-12-02
12022-12-03
22022-12-01
22022-12-04

(1) 先开个窗

不了解或不熟悉开窗函数的,可以看下这篇:

通俗易懂:窗口函数 | 全是案例,看完不懂算我输

select user_id, login_time,row_number() over(partition by user_id order by login_time) num from login_log;

开完窗的结果如下:

user_idlogin_timenum
12022-11-281
12022-12-012
12022-12-023
12022-12-034
22022-12-011
22022-12-042

(2) 利用等差数列的特性

若是连续登录,login_time - num 则相等。

因此可以这样写:

select t.user_id,     t.login_time,     date_sub(login_time, INTERVAL t.num DAY) date_rsltfrom (    select user_id, login_time,     row_number() over(partition by user_id order by login_time) num     from login_log) t;

注:INTERVAL 关键字可以用于计算时间间隔, date_sub(login_time, INTERVAL t.num DAY)表示登录时间减去 num 天;若 DAY 改成 HOUR 表示减去 num 小时。

以上 SQL 执行后得到:

user_idlogin_timedate_rslt
12022-11-282022-11-27
12022-12-012022-11-29
12022-12-022022-11-29
12022-12-032022-11-29
22022-12-012022-11-30
22022-12-042022-12-02

(3) 分组后可获得结果

select a.user_id,    a.date_rslt,    count(1) as cntfrom(    select         t.user_id,         t.login_time,        date_sub(login_time, INTERVAL t.num DAY) date_rslt    from         (        select user_id,         login_time,         row_number() over(partition by user_id order by login_time) num         from login_log        ) t) agroup by a.user_id, a.date_rslt; 

以上就是全部内容啦,想学习更多大数据相关知识,关注大数据的奇妙冒险

点赞关注不迷路,转载请注明出处。

大数据的奇妙冒险

分享大数据相关知识,关注我,一起经历大数据的奇妙冒险

34篇原创内容

公众号

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值