一、建表

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条数据的更多相关文章

  1. sql 分组后显示每组的前几条记录

    sql 分组后显示每组的前几条记录 如   表中记录是             code       serialno             A1               1           ...

  2. sql-实现select取行号、分组后在分组内排序、每个分组中的前n条数据

    表结构设计: 实现select取行号 sql局部变量的2种方式 set @name='cm3333f'; select @id:=1; 区别:set 可以用=号赋值,而select 不行,必须使用:= ...

  3. MySQL 分组后取每组前N条数据

    与oracle的 rownumber() over(partition by xxx  order by xxx )语句类似,即:对表分组后排序 创建测试emp表 1 2 3 4 5 6 7 8 9 ...

  4. SQL Server 获取满足条件的每个条件下的前N条数据

    从数据库获取数据时,经常会遇到获取一个数据列表和该列表中每条数据对应的另一个列表的情况,如果二级列表获取的是全部数据,那么就比较简单.如果二级列表获取的是前n条数据,就会比较麻烦. 从操作上来看,好像 ...

  5. 不同数据库,查询前n条数据的SQL语句

    不同的数据库,支持的SQL语法略有不同,以下是不同数据库查询前n条数据的SQl语句 SQL Server(MSSQL) SELECT TOP n * FROM table_name ORACLE SE ...

  6. SQL学习(三)Select语句:返回前多少行数据

    在实际工作中,我们可能根据某种排序后,只需要显示前多少条数据,此时就需要根据不同的数据库,使用不同的关键字 一.SQL Server/Access select top 数量/百分比 from tab ...

  7. SQL分组排序后取每组最新一条数据的另一种思路

    在hibernate框架和mysql.oracle两种数据库兼容的项目中实现查询每个id最新更新的一条数据. 之前工作中一直用的mybatis+oracle数据库这种,一般写这类分组排序取每组最新一条 ...

  8. sql server 分组,取每组的前几行数据

    sql中group by后,获取每组中的前N行数据,目前我知道的有2种方法 比如有个成绩表: 里面有字段学生ID,科目,成绩.我现在想取每个科目的头三名. 1.   子查询 select * from ...

  9. mysql 分组统计、排序、取前N条记录解决方案

    需要在mysql中解决记录的分组统计.排序,并抽取前10条记录的功能.现已解决,解决方案如下: 1)表结构 CREATE TABLE `policy_keywords_rel` ( `id` int( ...

随机推荐

  1. mui滚动区域的实现

    mui框架实现页面中间区域滚动,头部和底部固定不动,要滚动的区域一定要有mui-scroll-wrapper 和 mui-scroll 包裹 <div class="mui-conte ...

  2. PHP 常用自定义函数

    模拟 POST.GET 请求 /** * 模拟post进行url请求 * @param string $url * @param string $param */ protected function ...

  3. 热经-北京中地时空数码科技有限公司-研发工程师(WEBGIS方向)

    一面: 登记,填写个人信息 笔试 选择题: HTML,CSS,JS 的选择题,都是基础题.其中有一道问哪个不是 document 的属性或方法,我在 bgColor 和 focus() 上面纠结了一下 ...

  4. jmeter添加自定义扩展函数之图片base64

    原文连接:---------https://www.cnblogs.com/qiaoyeye/p/7218770.html----------- 打开eclipse,新建maven工程,在pom中引用 ...

  5. (子文章)Spring Boot搭建两个微服务模块

    目录 1. 创建工程和user-service模块 1.1 创建空工程 1.2 在空工程里新建Module 2. 配置文件 2.1 pom.xml 2.2 application.yml 3. 代码 ...

  6. win10右键在此处打开CMD

    1.在网上找了好多发现都不能运行,最后找到一个靠谱的记下来,方便以后使用. 2.新建一个 .reg格式的脚本 Windows Registry Editor Version 5.00 [HKEY_CL ...

  7. Centos7从零开始】Centos 下硬盘分区的最佳方案

    https://www.cnblogs.com/chen1970/p/11071590.html 在对硬盘进行分区前,应该先弄清楚计算机担负的工作及硬盘的容量有多大,还要考虑到以下几个问题: 第一点也 ...

  8. JS 获取json key和value

    var json= { "Type": "Coding", "Height":100 }; for (var key in json) { ...

  9. 从0开始的InfiniBand硬件踩坑过程

    由于科学计算实验的需求,需要使用InfiniBand做一个持久性内存全互联的分布式存储系统.其中从网卡到交换机使用Mellanox全家桶,而在Mellanox网卡与交换机的使用过程中还是遇到了不少的问 ...

  10. How To Release and/or Renew IP Addresses on Windows XP | 2000 | NT

    Type 'ipconfig' (without the quotes) to view the status of the computer's IP address(es). If the com ...