SELECT a.cid,a.play_cnt pv,a.time_len
FROM(
    SELECT
        t1.cid,
        COUNT(*) play_cnt,
        SUM(timestampdiff(minute,t2.start_time,t2.end_time)) time_len,
        DENSE_RANK() OVER(order by COUNT(*) DESC,SUM(timestampdiff(minute,t2.start_time,t2.end_time)) DESC) ranking
    FROM course_info_tb t1
    INNER JOIN play_record_tb t2
    ON t1.cid = t2.cid
    AND t2.start_time IS NOT NULL
    AND t2.end_time IS NOT NULL
    AND timestampdiff(day,t1.release_date,date_format(t2.start_time,'%Y-%m-%d')) <= 7
    GROUP BY t1.cid
    HAVING AVG(t2.score) >= 3
) a
WHERE a.ranking <= 3