如何编写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
相关产品推荐
相关产品推荐

