SQL中如何对每个timestamp分组内的数据取前3条记录?
按分组获取Top N记录的SQL实现方案
当前执行的SQL查询:
SELECT timestamp, movie_rating FROM Movies ORDER BY timestamp, movie_rating DESC需要实现仅显示每个
timestamp分组内评分最高的前3条电影记录,但直接添加LIMIT 3只能返回全局前3条,无法满足分组取Top N的需求。
不同数据库的具体实现
MySQL 8.0+ / PostgreSQL / SQL Server(支持窗口函数)
使用ROW_NUMBER()窗口函数按timestamp分组,组内按评分降序排序,筛选行号≤3的记录即可:
SELECT timestamp, movie_rating FROM ( SELECT timestamp, movie_rating, ROW_NUMBER() OVER (PARTITION BY timestamp ORDER BY movie_rating DESC) AS rn FROM Movies ) ranked_movies WHERE rn <= 3 ORDER BY timestamp, movie_rating DESC;
- 若需要保留同评分的所有记录(比如同分时都算入Top3),可以把
ROW_NUMBER()替换为RANK()或DENSE_RANK():RANK():同评分记录会获得相同行号,后续行号会跳过(比如1,1,3)DENSE_RANK():同评分记录获得相同行号,后续行号连续(比如1,1,2)
MySQL 5.x(不支持窗口函数)
用关联子查询实现,统计同分组内评分大于等于当前记录的数量,数量≤3则保留:
SELECT m1.timestamp, m1.movie_rating FROM Movies m1 WHERE ( SELECT COUNT(*) FROM Movies m2 WHERE m2.timestamp = m1.timestamp AND m2.movie_rating >= m1.movie_rating ) <= 3 ORDER BY m1.timestamp, m1.movie_rating DESC;
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

