没通过代码

select artical_id,
       max(max_uv) max_uv
from (
         select artical_id,
                sum(in_num) over (
                    partition by artical_id
                    order by times,in_num desc
                    ) max_uv
         from (select artical_id,
                      in_time times,
                      '1'     in_num
               from tb_user_log
               where artical_id != '0'
               union all
               select artical_id,
                      out_time times,
                      '-1'     in_num
               from tb_user_log
               where artical_id != '0') t
     ) t1
group by artical_id
order by max_uv desc

每当我觉得我的DQL语言已经可以了的时候,就会有一个题出来打脸。

用的都是知道的东西可是我就是想了半天没想出来,最后还是参考(抄袭)大佬代码做出来。

可我也是做出来但没有完全做出来。

甚至我都不知道问题出在哪里。。。

这是我idea运行结果

alt

这是牛客结果

然后我认命加了round

alt

应该是网站问题。。。吧

直接摆烂复制大佬代码,人家的就没有出现这种情况

我能说什么呢?学吧,还有的学呢

大佬思路

我在想了半天终于认菜之后,看到大佬代码,直接震惊,拍案叫绝不足以形容我当时心情,上次出现这种情况还是在上次,,,啊不是在Mysql:连续出现的相同值

很简单也很绝,就是对每一个时间进行标记,进来就说明人数+1,出去就说明人数-1然后union求和就是同时存在的人数,牛啊

select artical_id,
      in_time times,
      '1'     in_num
from tb_user_log
where artical_id != '0'
union all
select artical_id,
      out_time times,
      '-1'     in_num
from tb_user_log
where artical_id != '0'

我之前也用过类似标记但是在这里完全没想起来

接下来问题就简单了窗口函数sum,再套一层求最大就行,对了还有一个坑:

(因为看了大佬题解完全没踩到坑的屑)

统计每篇文章同一时刻最大在看人数,如果同一时刻有进入也有离开时,先记录用户数增加再记录减少,结果按最大人数降序。

所以要在窗口函数求和的时候order by 一个in_num