题解 | #每篇文章同一时刻最大在看人数#
每篇文章同一时刻最大在看人数
http://www.nowcoder.com/practice/fe24c93008b84e9592b35faa15755e48
没通过代码
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运行结果
这是牛客结果
然后我认命加了round
应该是网站问题。。。吧
直接摆烂复制大佬代码,人家的就没有出现这种情况
我能说什么呢?学吧,还有的学呢
大佬思路
我在想了半天终于认菜之后,看到大佬代码,直接震惊,拍案叫绝不足以形容我当时心情,上次出现这种情况还是在上次,,,啊不是在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
一天一个Mysql 文章被收录于专栏
学习,一天一个mysql