字节跳动面试SQL-用户登录区间合并

推荐阅读文章列表

大数据开发面经汇总【持续更新...】

我的大数据学习之路

大数据开发面试笔记V6.0

SQL题目

来自字节跳动数据研发二面

  • 有一张用户行为日志表ods_usr_log, 包含user_id(用户id)、start_time(登录时间)以及end_time(注销时间)
  • 问题:求出用户登录的所有最大时间段,比如用户1在10:00登录且11点注销,用户2在10:30登录且12:00注销,那么最大时间段就是 10:00到12:00

答案解析

模拟数据

insert into ods_usr_log(user_id, start_time, end_time) values 
(1, '09:01', '10:30'),
(2, '08:10', '09:08'),
(3, '10:20', '11:00'),
(4, '12:00', '13:00'),
(5, '11:30', '11:59')

思路分析

难点:如何对交叉区间进行合并

  1. 按照登录时间和注销时间进行排序
  2. 如果登陆时间小于上一条记录的注销时间,就表示有交叉,打上标签flag=1
  3. 当flag由0变为1的时候,就表示多了一个分组,因此我们可以对flag进行累加,累加后的值即为分组id

具体代码

select 
     group_id
     ,min(start_time) as start_time
     ,max(end_time)   as end_time
from (
         select 
              start_time
              ,end_time
              ,sum(flag) over (order by start_time, end_time) as group_id
         from (
               select 
                    start_time
                    ,end_time
                    ,case when start_time <= lst_end_time then 0 else 1 end as flag
               from (
                         select 
                              start_time
                              ,end_time
                              ,lag(end_time, 1, end_time) over (order by start_time asc, end_time asc) as lst_end_time
                         from ods_user_log
                    ) t
              ) t
     ) t
group by group_id
;
#数据人的面试交流地##校招过来人的经验分享#
全部评论
如果有一个用户的登陆时间很早,退出时间很晚,这个算法就很容易出问题吧
点赞 回复 分享
发布于 2024-07-24 16:28 上海
如果登陆时间小于上一条记录的注销时间,就表示有交叉,打上标签flag=1 这里写错了,打上flag=0
点赞 回复 分享
发布于 2024-07-28 22:00 四川

相关推荐

头像
03-10 11:27
已编辑
门头沟学院 Java
📍面试公司:字节跳动👜面试岗位:后端开发📖面试问题:1.&nbsp;自我介绍2.&nbsp;开源经历都做了什么3.&nbsp;项目里的延时任务怎么用的4.&nbsp;定时任务呢5.&nbsp;分布式锁怎么实现6.&nbsp;如果锁过期了导致其它节点也执行定时任务怎么办(redission的看门狗,续期。或者不给锁设置过期时间,并将锁的value设置为节点ID,其它线程拿到锁的时候判断一下value是不是自己的ID,如果不是就不执行定时任务)7.&nbsp;volatile具体是怎么保证可见性和指令重排序,禁止指令重排序有什么实际的例子吗,具体是怎么起作用的(单例模式双重校验锁)8.&nbsp;synchronized又是怎么保证可见性的9.&nbsp;写代码,两个线程分别打印奇数和偶数10.&nbsp;给了一个SQL题,有id,type,&nbsp;createtime,name四个字段。建立了一个联合索引(type,&nbsp;createtime,&nbsp;name)。select&nbsp;*&nbsp;from&nbsp;table&nbsp;where&nbsp;type&nbsp;=&nbsp;1&nbsp;and&nbsp;createtime&nbsp;>&nbsp;xxx&nbsp;and&nbsp;name&nbsp;=&nbsp;%xxx%。怎么走索引。name&nbsp;=&nbsp;xxx%呢11.&nbsp;又给了一个sql题,有id&nbsp;和balance两个字段。A给B转账,怎么实现。12.&nbsp;如果与此同时,B也在给A转账呢,两个事务会发生什么情况13.&nbsp;有一个存储了几百万个电话号码的文件,怎么找到重复的电话号码(哈希表,位图,字典树)14.&nbsp;算法题,最长公共子序列&nbsp;15.&nbsp;反问🙌面试体验:事后复盘发现问题还是比较少的,但是一共面了70分钟。。。#软件开发笔面经#
点赞 评论 收藏
分享
评论
9
26
分享

创作者周榜

更多
牛客网
牛客企业服务