SQL Server 分组取 Top 笔记(row_number + over 实现)
先看SQL语句(注意:这是在SQL Server 2005+ [包括2005] 的版本才支持的哦,o(∩_∩)o 哈哈~)
SELECT
col1,col2,col3
FROM table1 AS a WITH(NOLOCK) INNER JOIN(
// 第一部分代码
SELECT
b1.col1,b1.col2,b1.col3,
ROW_NUMBER() OVER ( PARTITION BY b1.分组列名 ORDER BY b1.排序列 DESC/ASC ) AS sortedId
FROM table1 AS b1 WITH(NOLOCK)
) AS b WITH(NOLOCK) ON a.id=b.id
WHERE b.sortedId>= 需要 获取的 top 值
----------------------------------------------------------------------------------------------------------------------------------
// 第一部分代码(为什么这样写?)
重点是记录一下自己对 ROW_NUMBER() OVER ( ...... ) 组合的理解。
记得有一次面试,遇到这样一个问题( 怎么获取一张表 第30-40的数据记录,注意:表的主键id,可能不连续)。
大牛看到后,肯定会喷我的,那么简单,你说个毛啊。
是的,您喷得对,确实很很简单嘛。
SELECT
id,col1,col2
FROM table1 a INNER JOIN (
SELECT
id,
ROW_NUMBER() OVER ( ORDER BY ID ASC ) as rowId
FROM table1 b1
) AS b ON a.id = b.id
WHERE b.rowId BETWEEN $strartId AND $endId
------------------------------------------------------------------------------------------------------------------------
好吧,言归正传
ROW_NUMBER() OVER ( [ PARTITION BY 分组列名 ] ORDER BY 排序列 DESC/ASC ) AS sortedId
ROW_NUMBER() 为每一行数据分配一个连续的编号,这个编号可以一样的哦,它取决于后面的 OVER( [表达式] ORDER BY xxx DESC/ASC )
PARTITION BY col1 :通过 OVER 告诉 ROW_NUMBER() ,如果 2行(或者更多行) col1值是一样的,你就给我一样的编号,不要分配新的编号给我,谢谢~~ o(∩_∩)o
也就是说 用 【 ROW_NUMBER() OVER ( [ PARTITION BY col1] ORDER BY 排序列 DESC/ASC ) AS sortedId】生成的sortedId 实际上是按照 col1 分组了的
好嘛,扯完了,举个栗子呗。加深自己的印象。
有一张学生考试成绩表 stuSorceInfo(统计每一科成绩的第一名 [ 前三名,前N ])
主键ID 学生ID 科目ID 分数
id studentId subjectId score
1 1 1 81
-------------------------------------------------------------
2 1 2 88
-------------------------------------------------------------
3 2 1 80
-------------------------------------------------------------
4 2 2 98
-------------------------------------------------------------
获取 每一科成绩的第一名
SELECT a.* FROM stuSorceInfo a WHERE INNER JOIN (
SELECT
b1.studentId,
ROW_NUMBER( PARTTION BY subjectId ORDER BY b1.socre DESC ) sortedId
FROM stuSorceInfo b1
) AS b ON a.id=b.id WHERE b.sortedId=1 (第一名:=1,前三名:<=3 ,前N名:<=N)
参考资料:
http://blog.csdn.net/wuzhengqing1/article/details/8024634
http://www.cnblogs.com/gy51Testing/archive/2012/07/26/2609832.html
感谢每一位blog朋友的分享,谢谢!o(∩_∩)o 哈
SQL Server 分组取 Top 笔记(row_number + over 实现)的更多相关文章
- sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据
		
SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...
 - SQL Server 分组后取Top N
		
SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...
 - row_number和partition by分组取top数据
		
分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...
 - CASE函数  sql server——分组查询(方法和思想)  ref和out  一般处理程序结合反射技术统一执行客户端请求  遍历查询结果集,update数据   HBuilder设置APP状态栏
		
CASE函数 作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...
 - Spark 两种方法计算分组取Top N
		
Spark 分组取Top N运算 大数据处理中,对数据分组后,取TopN是非常常见的运算. 下面我们以一个例子来展示spark如何进行分组取Top的运算. 1.RDD方法分组取TopN from py ...
 - sql server中取交集、差集和并集的语法
		
这里简单总结下在SQL Server中取交集.差集和并集的语法. 交集:INTERSECT(适用于两个结果集) SELECT ID, NAME FROM YANGGB1 INTERSECT SELEC ...
 - sql server——分组查询(方法和思想)
		
思想 先排序在汇总 sql server里分组查询通常用于配合聚合函数,达到分类汇总统计的信息.而其分类汇总的本质实际上就是先将信息排序,排序后相同类别的信息会聚在一起,然后通过需求进行统计计算. 使 ...
 - sql server 分组排序
		
环境: sql server 2012 语法 select ROW_NUMBER() over(partition BY 分组字段 order by 排序字段),* as rowNums from 表 ...
 - Jmeter—8  连接microsoft sql server数据库取数据
		
本文以Jmeter 连接microsoft sql server为例. 1 从微软官网下载Microsoft SQL Server JDBC Driver 地址:http://www.microsof ...
 
随机推荐
- 0x40二分法
			
二分模板一共有两个,分别适用于不同情况.算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值. 版本1 在单调递增序列a中查找>=x的数中最小 ...
 - 自己编写shave函数
			
import numpy def shave(I,border=None): I = I[border[0]:I.shape[0]-border[0],border[1]:I.shape[1]-bor ...
 - prepareStatament和Statement和callableStatement的区别
			
关系与区别 Statement.PreparedStatement和CallableStatement都是接口(interface) Statement 1.Statement接口提供了执行语句和获取 ...
 - 服务器操作nginx相关操作命令
			
服务器操作nginx相关操作命令 登录服务器: ssh root@0.0.0.0 -p 22100 启动nginx: /usr/local/nginx/sbin/nginx 查看nginx是否启动 p ...
 - noip2018   洛谷  P5020 货币系统
			
关键: 要使m最小,(m,b)中的数不能用(n,a)中的数表示出来 对于 3 19 10 6 19=10+3+3+3 6=3+3 只有3 和 10 不能被(n,a)中的数表示 所以m=2 只需要 ...
 - 灵光一现的trick
			
感觉平时会丢掉好多挺好的trick…… 图论 1.图G,固定S,T.可以将任意一条边加上权值$k(k>0)$,求最大化加权后最短路. 2.图G,固定S,T.可以将任意一条边乘以权值$k(k> ...
 - 【MYSQL笔记2】复制表,在已有表的基础上设置主键,insert和replace
			
之前我自己建立好了一个数据库xscj:表xs是已经定义好的 具体的定义数据类型如下: 为了复制表xs,我们新建一个表名为xstext,使用下列语句进行复制xs,或者说是备份都可以: create ta ...
 - BAT及各大互联网公司2014前端笔试面试题
			
很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是大有裨益. 而更多的题目是我一路以来收集的,也有往年的,答案不确保一定正 ...
 - ES6笔记04-class的基本语法
			
JavaScript 语言中,生成实例对象的传统方法是通过构造函数. ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板.通过class关键字,可以定义类. clas ...
 - php+MySQL(存储过程) +yii2完整的增删改查
			
1在MySQL中创建存储过程 a 我将添加和修改 作为 一起 ), ), ), )) BEGIN FROM t_boss_role WHERE id = _id) THEN UPDATE t_boss ...