sql中查出每个分组的前n条记录

查询指定分类的前n篇文章

create table `person`
(
  `person` varchar(10),
  `group` int,
  `age` int
);

insert into `person` values
('Bob', 1, 32),
('Jill', 1, 34),
('Shawn', 1, 42),
('Jake', 2, 29),
('Paul', 2, 36),
('Laura', 2, 39);

// 查询语句
SELECT a.person, a.group, a.age FROM person AS a WHERE (SELECT COUNT(*) FROM person AS b WHERE b.group = a.group AND b.age >= a.age) <= 2 ORDER BY a.group ASC, a.age DESC

 

 

一句SQL:取得相同sortid的结果集,每种 ID三条数据

一个表:

SQL代码

CREATE TABLE `book` (   
  `bookid` int(11) unsigned NOT NULL AUTO_INCREMENT, 
  `sortid` int(11) NOT NULL, 
  `bookname` varchar(255) NOT NULL DEFAULT '', 
  PRIMARY KEY (`bookid`) 
) ENGINE=InnoDB AUTO_INCREMENT=80729 DEFAULT CHARSET=utf8; 

数据是这样的:

XML/HTML代码
insert  into `book`(`bookid`,`sortid`,`bookname`) values (1,1,'1'),(2,1,'2'),(3,1,'3'),(4,1,'4'),(5,2,'1'),(6,2,'2'),(7,2,'3'),(8,2,'4'),(9,2,'5'),(10,2,'6'),(11,2,'7'),(12,2,'8'),(13,2,'9'),(14,2,'10'),(15,2,'11'),(16,3,'1'),(17,3,'2'),(18,3,'3'),(19,3,'4'),(20,3,'5'),(21,3,'6'),(22,3,'7'),(23,3,'8'),(24,3,'9'),(25,3,'10'),(26,3,'11'),(27,3,'12'),(28,4,'1'),(29,4,'2'),(30,4,'3'),(31,4,'4'),(32,4,'5'),(33,5,'1'),(34,5,'2'),(35,5,'3'),(36,5,'4'); 

在这种情况下,要取得 sortid IN (1,2,3)的数据,每个sortid的结果是3条。

这种题目网上很多,但真的没有一种特别好SQL,在网上有很多种。最初的时候,我自己是想着用union来处理,但最终这种方法太伤了,同事clear提出的SQL不错,试了一下,在几万条数据的时候,效率还可以,而且SQL相对简单:

SQL代码

SELECT sortid,bookname FROM book b WHERE sortid IN(1,2) AND 3>(SELECT COUNT(1) FROM book WHERE b.sortid=sortid AND bookid<b.bookid)  

表自关联,在sortid上建索引,效率还不错

How to select the first/least/max row per group in SQL

时间: 2024-08-29 22:13:23

sql中查出每个分组的前n条记录的相关文章

sqlserver分组取前n条记录

  1.前言. 这个有两种方法.1是用in,2是用row_number(),可根据情况来用.两种都可以. 2.举例. 方法1: Java代码 select a.* from table1 a where a.column1 in (select max(column1) from table1 group by a.column2,column3) 方法2: Java代码 with nyr as ( select NYR,QYZX_DM,FXSP_XH,SPBM_DLJ,WBSP_GG,JGLX

mysql使用GROUP BY分组实现取前N条记录的方法_Mysql

本文实例讲述了mysql使用GROUP BY分组实现取前N条记录的方法.分享给大家供大家参考,具体如下: MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道怎么想的,当时表名直接敲了个aa,汗~~~~): 结果: 方法一: 复制代码 代码如下: SELECT a.id,a.SName,a.ClsNo,a.Score FROM aa a LEFT J

在SQL Server2005/2008中对记录进行分组,并获得每组前N条记录

本文为原创,如需转载,请注明作者和出处,谢谢!     假设有一个表,SQL语句如下: CREATE TABLE [dbo].[scan](     [km] [int] NULL,     [kh] [int] NULL,     [cj] [int] NULL ) ON [PRIMARY]     其中km为科目号.kh为考生号.cj为成绩,现对km和kh进行分组,并获得每组前2条记录(按cj从高到低排序).基本思想是为每组加一个序号列,再用where取序号小于等于2的.SQL语句如下: s

文本框-急!.net中如何使用虚拟表储存从sql中查出来的整行数据。请各位前辈教诲。

问题描述 急!.net中如何使用虚拟表储存从sql中查出来的整行数据.请各位前辈教诲. 具体功能是这样的:我想通过文本框输入在数据库中查询.并把在数据库中查询的结果通过datatable保存下来.!!!!!前辈们是把在文本框n次输入查询的结果都保存在datatable的虚拟表里.整行的整行的那种. 解决方案 你把查询出来的数据放在一个对象集合中或者数据集中,存在xml中 或者存在session中都可以,有很多种方式都可以实现,重要的是你要把数据存入虚拟的内存中就OK 了 解决方案二: 创建一个m

不同数据库中查询前几条记录的用法(SQL Server/Oracle/Postgresql)

SQL在不同数据库中查询前几条记录的用法分类 1. orACLE Select * FROM TABLE1 Where ROWNUM<=N 2. INFORMIX Select FIRST N * FROM TABLE1 3. DB2 Select * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM Where ROWNUM<=N 或者Select COLUMN FROM TABLE FETCH FIRST N ROWS ONLY 4. SQL

sql 让同一个队的技能名称在一条记录中

问题描述 sql 让同一个队的技能名称在一条记录中 如果是行转列,如何实现,我感觉行转列的话 他那个是要对应的 可是像我这种该如何对应呢?而且我那个技能 每个团队的不一样 用ID当字段会有空值 解决方案 不用那样设计,不方便查询.就这样就可以.需要的时候group by分组下http://bbs.csdn.net/topics/350093403

sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢?

问题描述 sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢? sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢? 解决方案 http://www.2cto.com/database/201509/442742.html 解决方案二: http://zhidao.baidu.com/link?url=zu-YuSRPF-4RKb_yrqC7cZm4Smbz_pWS31ltTFn6HIknGbUHgcOtH8FavG9o

SQL Server查询前N条记录的常用方法小结_MsSql

本文实例讲述了SQL Server查询前N条记录的常用方法.分享给大家供大家参考.具体如下: SQL Server查询前N条记录是我们经常要用到的操作,下面对SQL Server查询前N条记录的方法作了详细的介绍,如果您感兴趣的话,不妨一看. SQL Server查询前N条记录: 因为id可能不是连续的,所以不能用取得10<id<20的记录的方法. 有三种方法可以实现: 一.搜索前20条记录,指定不包括前10条 语句: 复制代码 代码如下: select top 20 * from tbl w

MySQL获取所有分类的前N条记录_Mysql

比如有文章表 Article(Id,Category,InsertDate),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用 SELECT A1.* FROM Article AS A1 INNER JOIN (SELECT A.Category,A.InsertDate FROM Article AS A LEFT JOIN Article AS B ON A.Category = B.Category AND A.InsertDate <= B.Inse