WITH
t1 AS (     -- 计算出每个课程发布后的7天是哪几天
    SELECT
        a.cid,
        a.start_time,
        a.end_time,
        score,
        DATE_ADD(b.release_date,INTERVAL 6 DAY) AS rq
    FROM play_record_tb AS a
    INNER JOIN course_info_tb AS b
        ON a.cid = b.cid
),

t2 AS (     -- 计算每个课程在发布7天内的播放次数、评价评分和观看总时长
    SELECT
        cid,
        AVG(score) AS pf,
        COUNT(*) AS bfl,
        ROUND(SUM(TIMESTAMPDIFF(MINUTE,start_time,end_time)),3) AS zsc      -- 如果对计算结果精度要求高,可考虑把MINUTE换成SECOND / 60
    FROM t1
    WHERE DATE(start_time) <= rq
    GROUP BY cid
    HAVING pf >= 3
),

t3 AS (     -- 使用窗口函数对每个课程的受欢迎程度进行排名
    SELECT
        cid,bfl,zsc,
        RANK() OVER(ORDER BY bfl DESC,zsc DESC) AS rk
    FROM t2
)

SELECT      -- 按照受欢迎程度显示排名前三的课程相关信息
    cid,
    bfl AS pv,
    zsc AS time_len
FROM t3
WHERE rk <= 3
ORDER BY rk;