sqlServer 取每组的前几条数据
首先的建表语句:
if exists (select * from sysobjects where id = OBJECT_ID('[test]') and OBJECTPROPERTY(id, 'IsUserTable') = ) DROP TABLE [test]
CREATE TABLE [test] ( [id] [int] IDENTITY (, ) NOT NULL , [name] [nvarchar] () NULL , [votenum] [int] NULL , [type] [nvarchar] () 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 ( , '嶂石岩' , , '风景' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '云梦山' , , '风景' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '抱犊寨' , , '风景' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '崆山白云洞' , , '风景' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '扁鹊庙' , , '古迹' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '金长城' , , '古迹' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '避暑山庄' , , '古迹' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '西柏坡' , , '古迹' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '塞罕坝' , , '草原' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '草原天路' , , '草原' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '京北草原' , , '草原' )
INSERT [test] ( [id] , [name] , [votenum] , [type] ) VALUES ( , '美林谷' , , '草原' )
SET IDENTITY_INSERT [test] OFF
字段含义:name 风景区名称,votenum 景区得票数量 ,type 景区类型
实现功能:查询各分类中投票最多的两个景区,按投票数从高到低排序

实现1: ROW_NUMBER() 配合partition by 按照分组进行排序,取前两位,易懂
select name,votenum,[type] from (
select *,ROW_NUMBER() over(partition by [type] order by votenum desc) vn from test) b
where b.vn<= order by [type], votenum desc
实现2:自连接
select * from test a
where (select COUNT(*) from test b where a.type=b.type and a.votenum<b.votenum) <=
order by [type],votenum desc
外层表a中的一条数据 在内层表b中查找的相同类型type,且b表中投票数量大于a表中该条记录的投票数量的记录数(count),
如果小于1,说明a表中的这条数据 的投票数是最高或者是第二高的,则返回a表中的这条数据
实现3:
select * from test a
where a.id in(select top b.id from test b where a.type=b.type order by b.votenum desc)
order by [type],votenum desc
sqlServer 取每组的前几条数据的更多相关文章
- sql 分组取每组的前n条或每组的n%(百分之n)的数据
sql 分组取每组的前n条或每组的n%(百分之n)的数据 sql keyword: SELECT * ,ROW_NUMBER() OVER(partition by b.UserID order by ...
- MySQL取每组的前N条记录
一.对分组的记录取前N条记录:例子:取前 2条最大(小)的记录 .用子查询: SELECT * FROM right2 a WHERE > (SELECT COUNT(*) FROM right ...
- sql server 分组,取每组的前几行数据
sql中group by后,获取每组中的前N行数据,目前我知道的有2种方法 比如有个成绩表: 里面有字段学生ID,科目,成绩.我现在想取每个科目的头三名. 1. 子查询 select * from ...
- sql 用Group by分组后,取每组的前几条记录
转自:http://blog.163.com/jeson_lwj/blog/static/135761083201052411115783/ --查询每门课程的前2名成绩 CREATE TABLE S ...
- 用Group by分组后,取每组的前3条记录,怎么取?
使用子查询进行查询 SELECT * FROM home_content a WHERE ( SELECT count(id) FROM home_content WHERE class_link = ...
- sqlserver获取当前id的前一条数据和后一条数据
一.条件字段为数值的情况 select * from tb where id=@id; --当前记录 select top 1 * from tb where id>@id order ...
- sql 实现分页+分组并取出分组内的前n条数据
一.建表 if exists (select * from sysobjects where id = OBJECT_ID('[test]') and OBJECTPROPERTY(id, 'IsUs ...
- MySQL 分组后取每组前N条数据
与oracle的 rownumber() over(partition by xxx order by xxx )语句类似,即:对表分组后排序 创建测试emp表 1 2 3 4 5 6 7 8 9 ...
- DataTable相关操作,筛选,取前N条数据,获取指定列数据
DataTable相关操作,筛选,取前N条数据,获取指定列数据2013-03-12 14:50 by Miracle520, 2667 阅读, 0 评论, 收藏, 编辑 1 #region DataT ...
随机推荐
- lintcode:Plus One 加一
题目: 加一 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照大小进行排列,最大的数在列表的最前面. 样例 给定 [1,2,3] 表示 123, 返回 [1,2,4 ...
- [hackerrank]John and GCD list
https://www.hackerrank.com/contests/w8/challenges/john-and-gcd-list 简单题,GCD和LCM. #include <vector ...
- springmvc环境的搭建
最近应公司要求,用了2天时间学了springmvc的搭建,就简单总结一下: springmvc和struts2的比较,因为我是学过struts的,它们都是基于mvc模式而设计的web层框架 它们最大的 ...
- Sina App Engine(SAE)入门教程(4)- SaeVCode(验证码服务)使用
参考资料 SaeVCode api 文档 使用教程 所有的验证码原理都是生成一个vcode字符串,存到session中,和用户的输入进行比较判断,以下是一个使用验证码服务的完整实例: 首页index. ...
- Hibernate逍遥游记-第13章 映射实体关联关系-003单向多对多
0. 1. drop database if exists SAMPLEDB; create database SAMPLEDB; use SAMPLEDB; create table MONKEYS ...
- 一个酷炫的,基于HTML5,Jquery和Css的全屏焦点图特效,兼容各种浏览器
基于HTML5和CSS的焦点图特效,梅花图案的背景很有中国特色,而且还会动哦,效果超炫,推荐下载! 演示图 html代码 <!DOCTYPE html PUBLIC "-//W3C// ...
- player/stage 学习---安装
环境 ubuntu 14.04 一,工具安装 sudo apt-get install git cmake g++ fltk1.1-dev libjpeg8-dev libpng12-dev libg ...
- openfire+spark+smack实现即时通讯
近公司项目需要用到即时通讯功能,经过调研发现openfire+spark+smack可以实现.在网上找了很久,资料都十分有限,即使有些朋友实现了也说的不清不楚.于是决定自己研究,耗时一周的时间实现了文 ...
- 在XML里的XSD和DTD以及standalone的使用3----具体使用详解
本人亲自写的一个简单的测试例子 1.xsd定义 <?xml version="1.0" encoding="utf-8"?><xs:schem ...
- TeeChart显示三维的图形,使用Surface
绘制一个球 根据公式x^2+y^2+z^2=R^2; 令x=RsinAcosB y=RcosAcosB z=RsinB using System; using System.Collections. ...