题解 | 输出播放量最高的视频

输出播放量最高的视频

https://www.nowcoder.com/practice/9e9cb264e1f64e28846975d5a32ba8e4

-- 核心思路如下:
-- 1.贪心相同视频id的时间区间
-- 2.可转化为统计各cid中,该cid对应的start_time被多少个[start_time,end_time]包含
-- 3.group by a.id, a.cid
-- 注意:这里要引入id来确定唯一一行记录
select 
    cid,
    round(cast(max(cnt) as float), 3) as max_peak_uv
from (
    select 
        a.cid,
        sum(if(a.start_time between b.start_time and b.end_time, 1, 0)) as cnt
    from play_record_tb a 
    left join play_record_tb b on a.cid=b.cid
    group by a.id, a.cid
) t
group by cid
order by max_peak_uv desc 
limit 3

再来贡献一种写法:

select 
    cid,
    round(cast(max(cnt) as float), 3) as max_peak_uv
from (
    select 
        cid,
        sum(flag) over(partition by cid order by action_time) as cnt
    from (
        select 
            cid,
            start_time as action_time,
            1 as flag
        from play_record_tb a
        union all 
        select 
            cid,
            end_time as action_time,
            -1 as flag
        from play_record_tb b
    ) t
) tt
group by cid
order by max_peak_uv desc
limit 3

全部评论
请问为什么可以只检查开始时间点
2 回复 分享
发布于 2025-09-25 20:05 广东
这个group by的字段顺序好奇怪,group by a.cid,a.id比较合适
2 回复 分享
发布于 2025-05-12 03:18 江西
保留小数那里为什么多次转换呢,直接这样round(max(cnt) * 1.0, 3) as max_peak_uv 会不会简洁一点
1 回复 分享
发布于 2025-12-29 21:42 河北
为什么不可以写on a.id=b.id
1 回复 分享
发布于 2025-09-08 15:04 广东
甚至可以不 group by a.cid,反正 id 是 primary key
1 回复 分享
发布于 2025-08-07 06:24 美国
请问大佬group by 里按id,和start_time 分组是为什么
1 回复 分享
发布于 2025-04-26 21:02 江苏

相关推荐

评论
37
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务