WITH t_user_log AS
(
SELECT artical_id
,in_time
,1 AS diff
FROM tb_user_log
WHERE artical_id != 0
UNION ALL
SELECT artical_id
,out_time
,-1 AS diff
FROM tb_user_log
WHERE artical_id != 0
)
SELECT artical_id
,MAX(instant_viewer_cnt) AS max_uv
FROM(
SELECT artical_id
,SUM(diff) OVER(PARTITION BY artical_id ORDER BY in_time, diff DESC) AS instant_viewer_cnt
FROM t_user_log
) data1
GROUP BY artical_id
ORDER BY max_uv DESC
- 创建变量diff,并借助窗口函数SUM求和的行范围数据,求每个in time的最大数据人数
- 求和时,不仅要根据in_time顺序求和,对于in_time相同的条件下,先对diff=1的先求和,ORDER BY in_time, diff DESC
- 求和取得每小时最大人数数据后,对于不同artical_id求对应的最大值即可