SQL中OVER(PARTITION BY)详解
一:首先我们先举个例子来认识一下over的庐山真面目
现在我们的需求是查询出来两个班级的前三名可以通过以下:
之前我的想法是根据分数排序然后取三条,后面发现如果分数一致的话,比如有3个人并列第一名,则这样的写法就完全不满足需求,所以我们可以通过over开窗函数来实现上面的要求
SELECT * FROM ( SELECT Name ,Score ,ClassId ,RANK() OVER ( PARTITION BY classid ORDER BY score DESC ) ScoreRank FROM t_student) AS s
WHERE s.ScoreRank < 4;
- 1
- 2
得到的结果如下:
注意:
1:sqlserver中的From (字表)的时候一定要As,否则报语法错误
2:RANK() 这个指的是为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。
3:Rank() Over(PARTITION BY classid ORDER BY score DESC )是指的先根据classid分组,然后再根据score分数倒叙排列,则是指的分组后生成Rank的序列化号
单单执行 SELECT Name ,Score ,ClassId ,RANK() OVER ( PARTITION BY classid
ORDER BY score DESC ) ScoreRank FROM t_student会出现下面的结果:
二:Over的一些语法与用法
语法结构:OVER( [ PARTITION BY … ] [ ORDER BY … ] )
1 、partition by 字段名字A:子句进行分组,partition by是固定的分组语法;
2、order by 字段名字B:子句进行排序,order by 是固定的排序语法。
比如我们上面的例子就是用到了partition by classid 和 order by score这样的用法了,注意:如果联合使用指的意思是:先分组然后再排序
OVER()函数不能单独使用,必须跟在 排名函数( ROW_NUMBER、DENSE_RANK、RANK、NTILE) 或 5种聚合函数(SUM、MAX、MIN、AVG、COUNT)后边。
三:排名开窗函数
语法结构:排名函数() OVER ( [ <partition_by字段> ] <order_by字段> )
注意:在排名开窗函数中必须使用ORDER BY语句
下面分别介绍一下各个排名函数的用法和效果
1、ROW_NUMBER():为每一组的行记录按顺序生成一个唯一的行号。这个用的最多的是不连续的Id上下分页,重新生成id,也就是一行会生成一个连续的id值,如下:
注意:如果是分组,则每个组里面的id是连续的
2、RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER
BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。
3、DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。也就是说如果两个相同的行生成序号3,那么接下来生成的序号还是4。
4、NTILE (integer_expression) 按照指定的数目将数据进行分组,并为每一组生成一个序号。
四:聚合开窗函数
语法结构:聚合函数( ) OVER ( [ partition by 字段] [order by 字段]) ,其中【partition by
字段】和【order by 字段】是可选择的
1:Max聚合函数
2:sum聚合函数
3:count聚合函数
另外开窗函数和聚合函数的不同之处是:开窗函数对于每个组返回多行,而聚合函数对于每个组只返回一行
SQL中OVER(PARTITION BY)详解相关推荐
- iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解
IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(Logical EXPression, Numeric Expression1, Numeric Expression2) 如 ...
- sql中的iif语句详解
IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(«Logical Expression», «Numeric Expres ...
- SQL中CONVERT()函数用法详解
SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...
- SQL中的ISNULL函数详解及用途
SQL中有多种多样的函数,下面将为您介绍SQL中的ISNULL函数,包括其语法.注释.返回类型等,供您参考,希望对您学习SQL能够有所帮助 ISNULL 使用指定的替换值替换 NULL. 语法 ISN ...
- mysql iif函数_sql中的iif语句详解_mysql
IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(«Logical Expression», «Numeric Expression1», «Numeric Expressio ...
- php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念
js里常用的如下 - phpStudy...
JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...
- SQL Server DBA工作内容详解
原文:SQL Server DBA工作内容详解 在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色. ...
- 常用经典SQL语句大全完整版--详解+实例 (存)
常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012 http://blog.sina.com.cn/s/blog_84 ...
- SQL Server 2005 常用数据类型详解
SQL Server 2005 常用数据类型详解 [b]1. 字符串数据类型[/b] char 此数据类型可存储1~8000个定长字符串,字符串长度在创建时指定:如未指定,默认为char(1).每个字 ...
- SQL语句 SELECT LIKE用法详解
在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...
最新文章
- 用@Data注解的形式替代类中的setter、getter方法
- 【vs开发】向图形界面程序添加控制台
- 你真的知道 NoSuchMethodError 发生原因和解决办法吗
- python16进制转2进制流_将十六进制文件转换为二进制文件
- python echo(msg) 字符串_[宜配屋]听图阁
- 华三云:不做开源的投机者
- dell加装固态硬盘_技术丨如何进行笔记本硬盘拆装?
- 【maven】maven入门以及maven常用命令
- hibernate 多对多注解配置
- BUG解决:RuntimeError:Given groups=1,weight of size...expected input...but got 3 channels instead.
- 【论文写作】课程指导平台的开发中系统流程如何写
- HbuilderX中 华为手机 真机调试
- 小米手环如何连接苹果手机
- 如何学习Android驱动开发
- vue部署到内网和外网配置简要说明
- 推荐一款远程控制软件Toesk。支持文件传输、高清画质、隐私屏、键盘鼠标映射等功能。
- 数学建模——规划问题
- javascript实用例子
- 车载CarPlay盒子的蓝牙应用案例
- 分析许嵩的175首歌曲,看看大家为什么那么喜欢听他的歌