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

如何编写SQL查询从Messages表每个分类选取2条数据?

每个分类选取指定条数数据的高效SQL方案

嘿,这个需求在日常开发里挺常见的,尤其是数据量不小的时候,得选个高效的写法才行。针对你的Messages表场景,用窗口函数是最优解,不管是上千条数据还是20多个分类,性能都能hold住。

先给你直接上可用的SQL语句:

SELECT Id, Content, Category, createdAt
FROM (
    SELECT 
        Id, Content, Category, createdAt,
        -- 按分类分组,每组内按创建时间排序并生成序号
        ROW_NUMBER() OVER (PARTITION BY Category ORDER BY createdAt) AS row_num
    FROM Messages
) AS ranked_messages
-- 筛选每个分类的前2条
WHERE row_num <= 2;

代码细节说明:

  • PARTITION BY Category:把整张表的数据按Category字段拆分成独立分组,比如cat1组、cat2组,每个分组内部单独处理。
  • ORDER BY createdAt:指定每个分组内的排序规则,这里用创建时间升序取最早的2条;如果想取最新的2条,改成ORDER BY createdAt DESC就行,也可以换成Id这类自增字段排序。
  • ROW_NUMBER():给每个分组内的行生成从1开始的连续序号,每个分组的序号都是独立重新计数的。
  • 外层查询只保留序号≤2的行,刚好实现每个分类取2条数据的需求。

这个写法适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle等支持窗口函数的主流数据库,性能比关联子查询这类老方法好很多,特别适合你这种数据量较大的场景。

内容的提问来源于stack exchange,提问作者shivaji bhosale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:15:10