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 ...
随机推荐
- JavaWeb项目开发案例精粹-第2章投票系统-001设计
1.项目结构 2.数据库设计 # MySQL-Front 5.0 (Build 1.0) /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */; /*!40101 SET ...
- ISO9000与ISO9001的区别
很多人询问ISO9000和ISO9001的区别在哪里,其实这是一个概念上的误解. ISO9001是ISO9000族标准所包括的一组质量管理体系核心标准之一.ISO9000族标准是国际标准化组织(ISO ...
- 模拟在table中移动鼠标,高亮显示鼠标所在行
在项目中有这样一个需求,在table中移动鼠标时,鼠标所在行高亮显示,其他行正常显示,为此做了一个模拟. 具体代码如下: <!DOCTYPE html> <html xmlns=&q ...
- EF 实体关系
基于共享主键的一对一: this.HasRequired(t => t.TRDConInfo) .WithOptional(t => t.TRDFoundationProjCheck); ...
- OpenCV源码阅读(3)---matx.h---学习心得
在.h文件里定义类,可以通过内联函数的方法完成类基础函数的实现,这样就不需要额外写.cpp文件来写类的内容. 对于操作符重载,可以使用返回应用的方式减小内存开销 _Tp& someclass: ...
- Java API —— Map接口
1.Map接口概述 · 将键映射到值的对象 · 一个映射不能包含重复的键 · 每个键最多只能映射到一个值 2.Map接口和Collection接口的 ...
- 非常实用的PHP代码片段推荐
当使用PHP进行开发的时候,如果你自己收 藏 了一些非常有用的方法或者代码片段,那么将会给你的开发工作带来极大的便利.今天我们将介绍10个超级好用的PHP代码片段,希望大家能够喜欢! 1. 使用te ...
- 面试题_1_to_16_多线程、并发及线程的基础问题
多线程.并发及线程的基础问题 1)Java 中能创建 volatile 数组吗?能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引 ...
- hdu 4972 A simple dynamic programming problem (转化 乱搞 思维题) 2014多校10
题目链接 题意:给定一个数组记录两队之间分差,只记分差,不记谁高谁低,问最终有多少种比分的可能性 分析: 类似cf的题目,比赛的时候都没想出来,简直笨到极点..... 最后的差确定,只需要计算和的种类 ...
- struts2 获取前台表单的值?? 原理??
struts2中,在ACTION中申明一个变量 private string 变量名:然后设置变量名 的get/set方法: 在运行的时候struts2会自动获取. 比如:jsp 页面中有个文本框&l ...