感谢题解的各位大佬
-- 每篇文章
-- 同一时刻
-- 最大在看人数
SELECT
artical_id,
MAX(instant_viewer_cnt) max_uv
FROM (
SELECT
artical_id,t1.dt,t1.diff,
SUM(diff) OVER(PARTITION BY artical_id ORDER BY dt, diff DESC) instant_viewer_cnt
FROM (
SELECT
artical_id, in_time dt, 1 diff
FROM tb_user_log
WHERE artical_id != 0
UNION ALL
SELECT
artical_id, out_time dt, -1 diff
FROM tb_user_log
WHERE artical_id != 0) t1
ORDER BY t1.dt
) t2
GROUP BY 1
ORDER BY 2 DESC
SELECT
artical_id, in_time dt, 1 diff
FROM tb_user_log
WHERE artical_id != 0
UNION ALL
SELECT
artical_id, out_time dt, -1 diff
FROM tb_user_log
WHERE artical_id != 0
设置in_time时间点为1,out_time时间点为-1
9001 2021-11-01 10:00:01 1
9001 2021-11-01 10:00:09 1
9001 2021-11-01 10:00:11 -1
9001 2021-11-01 10:00:28 1
9001 2021-11-01 10:00:38 -1
9001 2021-11-01 10:00:51 1
9001 2021-11-01 10:00:58 -1
9001 2021-11-01 10:00:59 -1
9001 2021-11-01 10:01:50 -1
9002 2021-11-01 11:00:45 1
9002 2021-11-01 11:00:55 1
9002 2021-11-01 11:01:11 -1
9002 2021-11-01 11:01:24 -1
2.计算每个时间节点的人数变化
SELECT
artical_id,t1.dt,t1.diff,
SUM(diff) OVER(PARTITION BY artical_id ORDER BY dt, diff DESC) instant_viewer_cnt
FROM (
SELECT
artical_id, in_time dt, 1 diff
FROM tb_user_log
WHERE artical_id != 0
UNION ALL
SELECT
artical_id, out_time dt, -1 diff
FROM tb_user_log
WHERE artical_id != 0) t1
ORDER BY t1.dt
9001 2021-11-01 10:00:00 1 1
9001 2021-11-01 10:00:01 1 2
9001 2021-11-01 10:00:09 1 3
9001 2021-11-01 10:00:11 -1 2
9001 2021-11-01 10:00:28 1 3
9001 2021-11-01 10:00:38 -1 2
9001 2021-11-01 10:00:51 1 3
9001 2021-11-01 10:00:58 -1 2
9001 2021-11-01 10:00:59 -1 1
9001 2021-11-01 10:01:50 -1 0
9002 2021-11-01 11:00:45 1 1
9002 2021-11-01 11:00:55 1 2
9002 2021-11-01 11:01:11 -1 1
9002 2021-11-01 11:01:24 -1 0
最后在外面加group by
SELECT
artical_id,
MAX(instant_viewer_cnt) max_uv
from(...)
GROUP BY 1
ORDER BY 2 DESC