You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:52:22