SELECT
    T2.cid,T2.pv,T2.rk
FROM
    (
        SELECT
            t1.cid,
            t1.pv,
            t1.release_date,
            ROW_NUMBER() OVER (
                ORDER BY
                    CAST(t1.pv AS DECIMAL) DESC,
                    t1.release_date DESC
            ) AS RK
        FROM
            (
                SELECT
                    p.cid,
                    concat(ROUND(COUNT(*)),'.000') AS pv,
                    p.uid,
                    c.release_date
                FROM
                    course_info_tb AS c
                    LEFT JOIN play_record_tb AS p USING (cid)
                GROUP BY
                    p.uid,
                    p.cid,
                    c.release_date
                HAVING
                    COUNT(*) >= 2
                    AND p.cid IS NOT NULL
            ) AS t1
    ) AS T2
WHERE
    RK <= 3;