/*
思路:
要求输出:视频类型、转发量、转发率。保留三位小数
时间窗口:最近一个月内。
现有数据:用户互动表、短视频信息表。
步骤:
    ①清洗出时间窗口内的数据。
        -先用DATE_SUB(MAX(start_time), INTERVAL 29 DAY) 计算出基准日期范围(我们最早要看哪一天的记录)。
        -用CROSS JOIN 把基准日期连接到每一条记录后,再用WHERE过滤掉基准日期范围外的记录。
    ②计算指标:转发量和转发量率。
        -关联短视频信息表,因为需要用短视频信息表中的tag进行分组。
        -使用聚合函数计算转发量和转发率。
*/

WITH
sj AS (             -- 提取基准日期
    SELECT
        DATE_SUB(MAX(DATE(start_time)),INTERVAL 29 DAY) AS md       -- 得出最新日期的30天前是哪一天
    FROM tb_user_video_log
),

qx AS (             -- 清洗得出30天内的数据
    SELECT
        video_id,if_retweet
    FROM tb_user_video_log AS u
    CROSS JOIN sj  
    WHERE DATE(u.start_time) >= sj.md       -- 选定在30天基准内的记录
)

SELECT              -- 主查询,同时计算指标
    v.tag,
    SUM(CASE WHEN if_retweet = '1' THEN 1 ELSE 0 END) AS 转发量,        -- 转发的记作1,0或者其他奇怪的东西都记作0,最后相加得出转发量
    ROUND(SUM(CASE WHEN if_retweet = '1' THEN 1 ELSE 0 END) / COUNT(*),3) AS 转发率     -- 类别的转发量/类别的观看数=类别的转发率
FROM qx
INNER JOIN tb_video_info AS v
    ON (v.video_id = qx.video_id)
GROUP BY v.tag
ORDER BY 转发率 DESC;