sql 实现分页+分组并取出分组内的前n条数据

Posted 锋少

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 实现分页+分组并取出分组内的前n条数据相关的知识,希望对你有一定的参考价值。

一、建表 

if exists (select * from sysobjects where id = OBJECT_ID(\'[test]\') and OBJECTPROPERTY(id, \'IsUserTable\') = 1) DROP TABLE [test] 
CREATE TABLE [test] ( [id] [int] IDENTITY (1, 1) NOT NULL , [name] [nvarchar] (50) NULL , [votenum] [int] NULL , [type] [nvarchar] (50) NULL )
ALTER TABLE [test] WITH NOCHECK ADD CONSTRAINT [PK_test] PRIMARY KEY NONCLUSTERED ( [id] )

SET IDENTITY_INSERT [test] ON

INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 1 , \'嶂石岩\' , 88 , \'风景\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 2 , \'云梦山\' , 99 , \'风景\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 3 , \'抱犊寨\' , 59 , \'风景\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 4 , \'崆山白云洞\' , 46 , \'风景\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 5 , \'扁鹊庙\' , 56 , \'古迹\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 6 , \'金长城\' , 22 , \'古迹\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 7 , \'避暑山庄\' , 69 , \'古迹\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 8 , \'西柏坡\' , 87 , \'古迹\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 9 , \'塞罕坝\' , 48 , \'草原\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 10 , \'草原天路\' , 44 , \'草原\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 11 , \'京北草原\' , 36 , \'草原\' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( 12 , \'美林谷\' , 77 , \'草原\' )

SET IDENTITY_INSERT [test] OFF

 

二、说明

1、字段含义:name 风景区名称,votenum 景区得票数量 ,type 景区类型

2、实现功能:分页查出5-10条的数据,按id倒序排列并且相同的景区类型只取前两个

三、实现

1、实现分页

SELECT * FROM (
select *,ROW_NUMBER() over(order by id desc) row from test) T
WHERE T.row BETWEEN 1 AND 6

2、实现分组并去除组内前两条数据

select * from (
select *,ROW_NUMBER() over(partition by [type] order by id desc) vn from test) b
where b.vn<=2

三、实现分页+分组

SELECT * FROM (
select *,ROW_NUMBER() over( order by id desc) row from (select * from (
select *,ROW_NUMBER() over(partition by [type] order by id desc) vn from test WHERE id < 12) b
where b.vn<=2)bb) T
WHERE t.row BETWEEN 5 AND 10

三、总结

本文要点:第一步使用partition by函数对表格进行分组排序并每组只取前两个,第二步是使用sql分页的方式对第一步获取的数据进行分页

 

四、感谢

本文部分内容引用自

http://www.cnblogs.com/zhouxiuquan/p/4848765.html

 

以上是关于sql 实现分页+分组并取出分组内的前n条数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql分组后,取每组的前3条数据(并且有顺序)

oracle开展分组后,取出每组的前几条数据

sql取出每个分组的前几条

linq中分组查询而且获取每个分组中的第一条记录,数据用于分页绑定

MySQL分组查询后如何获取每组的前N条数据,你会吗?

mysql分组排序后取出几条记录,