--mySQL
with log as ( select uid, artical_id, in_time as dt, 1 is_in from tb_user_log where artical_id != '0' and artical_id != 0 union select uid, artical_id, out_time as dt, -1 is_in from tb_user_log where artical_id != '0' and artical_id != 0 ) select artical_id, max(uv) max_uv from ( select artical_id, dt, sum(is_in) over ( partition by artical_id order by dt asc, is_in desc ) uv from log ) t group by 1 order by 2 desc;
--SQL SERVER
with log as ( SELECT uid, artical_id, in_time as dt, 1 as is_in FROM tb_user_log where artical_id <> 0 union SELECT uid, artical_id, out_time as dt, -1 as is_in FROM tb_user_log where artical_id <> 0 ) select t1.artical_id, MAX(t1.is_in_num) as max_uv from ( select t.artical_id, t.dt, SUM(t.is_in) over ( partition by t.artical_id order by t.dt asc, t.is_in desc ) as is_in_num from log t ) t1 group by t1.artical_id order by MAX(t1.is_in_num) desc