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

SQL实现按列唯一值分组返回指定数量最新结果

获取每种type的最新10条记录的SQL方案

下面针对不同主流数据库,给出高效实现方案:

MySQL 8.0+ / PostgreSQL / SQL Server 方案(窗口函数法)

利用窗口函数ROW_NUMBER()按type分区,再按created_timestamp倒序排序,取每个分区内前10条记录,这是当前最优的实现方式,性能高效且逻辑清晰。

SELECT id, type, created_timestamp
FROM (
    SELECT 
        id, 
        type, 
        created_timestamp,
        ROW_NUMBER() OVER (PARTITION BY type ORDER BY created_timestamp DESC) AS row_num
    FROM reports
) AS ranked_reports
WHERE row_num <= 10
ORDER BY type, created_timestamp DESC;

逻辑说明

  • PARTITION BY type:将数据按type分组(分区)
  • ORDER BY created_timestamp DESC:每个分区内按创建时间倒序,最新的记录排在最前
  • ROW_NUMBER():给每个分区内的记录从1开始编号
  • 外层筛选row_num <=10,得到每个type的最新10条记录
  • 最后ORDER BY type, created_timestamp DESC确保结果按type分组展示,每组内按时间从新到旧排列

MySQL 5.x 兼容方案(关联子查询法)

如果使用不支持窗口函数的旧版MySQL,可以用关联子查询实现,但数据量较大时性能会比窗口函数差。

SELECT r1.id, r1.type, r1.created_timestamp
FROM reports r1
WHERE (
    SELECT COUNT(*)
    FROM reports r2
    WHERE r2.type = r1.type AND r2.created_timestamp >= r1.created_timestamp
) <= 10
ORDER BY r1.type, r1.created_timestamp DESC;

逻辑说明

  • 子查询统计当前记录同type下,创建时间大于等于它的记录数
  • 当这个计数≤10时,说明该记录是同type下最新的10条之一
  • 最后排序确保分组展示效果

内容的提问来源于stack exchange,提问作者No Such Agency

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:50:24