WITH a AS ( SELECT month(fdate) AS month, t1.user_id, t1.song_id, t2.song_name, t2.singer_name, t3.age FROM play_log t1 INNER JOIN song_info t2 ON t1.song_id = t2.song_id INNER JOIN user_info t3 ON t1.user_id = t3.user_id WHERE t3.age BETWEEN 18 AND 25 AND t2.singer_name = '周杰伦' AND YEAR(fdate) = 2022 ), b AS ( SELECT month, song_id, song_name, COUNT(*) AS play_pv FROM a GROUP BY month, song_id,song_name ), c AS ( SELECT month, song_name, play_pv, ROW_NUMBER() OVER ( PARTITION BY month ORDER BY play_pv DESC, song_id ) AS ranking FROM b ) SELECT month, ranking, song_name, play_pv FROM c WHERE ranking <= 3 ORDER BY month, ranking;