/*
思路:
需要输出:文章ID、最大同时浏览数量
有表:行为表
需要用到字段:文章ID、进入时间、退出时间
步骤:
①生成2张表:进入时间记作+1表,退出时间记作-1表,两个表都要生成一个行为发生时间,然后自连接得到得到完整的行为表。
②在行为表基础上,使用窗口函数,对文章ID分组,对行为发生时间升序,访问数倒序,对访问人数求和,得出每个行为变动时间的人数,先计算进入再计算退出,确保每次有人进入都会统计一次同时访问人数。
③对文章分组后,用MAX或者窗口函数取出最大同时访问数。
*/
WITH -- 使用CET格式
xw AS ( -- 生成完整的用户行为表
SELECT
artical_id,
in_time AS sj, -- 行为发生时间(进入)
1 AS uv -- 每有次有进入记作访问人数+1
FROM tb_user_log
UNION ALL -- 全量自连接进入表和退出表
SELECT
artical_id,
out_time AS sj, -- 行为发生时间(退出)
-1 AS uv -- 每有次有退出记作访问人数-1
FROM tb_user_log
),
ts AS ( -- 生成同时同时浏览人数看板,显示每次访问人数发生变化时的同时浏览数
SELECT
artical_id,
SUM(uv) OVER (PARTITION BY artical_id ORDER BY sj ASC,uv DESC) AS ll
# 使用窗口函数,对文章ID分组,对行为发生时间升序(访问数随时间变化),访问数倒序(确保如果在同一时间有进入也有退出,则先计算进入),对访问人数求和(得出正在访问的人数,即同时访问人数)
FROM xw
WHERE artical_id != 0 -- 筛除非文章内容页面的访问数据
)
SELECT
artical_id,
MAX(ll) -- 提取每篇文章的最大同时访问人数
FROM ts
GROUP BY artical_id -- 按照文章ID分组
ORDER BY MAX(ll) DESC; -- 按照最大同时访问数降序