题解 | #牛客直播各科目同时在线人数#

牛客直播各科目同时在线人数

http://www.nowcoder.com/practice/d69677e41f9a4bf3b3ed7a42573e9490

解题思路: 反向推导, 正向执行

反向推导

  1. 获取各科目最大同时在线人数, 需要计算各科目每一个瞬间的同时在线人数, 再进行筛选
  2. 计算各科目每个瞬间的同在在线人数, 只需要计算截止每个瞬间的上线人数减去下线人数即可
  3. 计算截止每个瞬间的上线和下线人数, 只需要生成一个用户上线和下线的总表, 再根据科目分组, 按照时间顺序叠加即可

正向执行

  1. 生成用户瞬间的上线和下线总表
  2. 根据科目分组, 按照时间顺序, 上线加1, 下线-1, 计算每个瞬间的在线人数
  3. 最后筛选出每个科目最大的同时在线人数
    select course_id,
           course_name,
           max(num)  as max_num 
      from (
            select course_id,
                   sum(diff) over (partition by course_id order by dt, diff desc) as num
              from (
                    select user_id,
                           course_id,
                           in_datetime as dt,
                           1 as diff
                      from attend_tb

                    union all 
                    select user_id,
                           course_id,
                           out_datetime as dt,
                           -1 as diff
                      from attend_tb
              ) as a 
      ) as b 
      join course_tb using(course_id)
  group by course_id,
           course_name 
  order by course_id 
全部评论
order by 后面为什么要跟diff呢,按时间顺序累计不就可以了吗
1
送花
回复
分享
发布于 2022-09-04 21:37 北京
计算截止每个瞬间的上线人数减去下线人数,为啥在开窗函数的时候不加上瞬间(这个时刻)的分组条件呢,而是只按照course_id分组?
点赞
送花
回复
分享
发布于 2022-06-28 17:05
秋招专场
校招火热招聘中
官网直投
把这个时刻加在分组条件中,就变成了以id和瞬间组合键的分组,统计出来的人数就不能反应随着时间推移的变化,也就不能统计出推移变化过程中的最大值。
点赞
送花
回复
分享
发布于 2022-07-14 10:09

相关推荐

7 收藏 评论
分享
牛客网
牛客企业服务