一:首先我们先举个例子来认识一下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)详解相关推荐

  1. iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解

    IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(Logical EXPression, Numeric Expression1, Numeric Expression2) 如 ...

  2. sql中的iif语句详解

    IIf   返回由逻辑测试确定的两个数值或字符串值之一.          语法      数字     IIf(«Logical   Expression»,   «Numeric   Expres ...

  3. SQL中CONVERT()函数用法详解

    SQL中CONVERT函数格式: CONVERT(data_type,expression[,style]) 参数说明: expression 是任何有效的 Microsoft® SQL Server ...

  4. SQL中的ISNULL函数详解及用途

    SQL中有多种多样的函数,下面将为您介绍SQL中的ISNULL函数,包括其语法.注释.返回类型等,供您参考,希望对您学习SQL能够有所帮助 ISNULL 使用指定的替换值替换 NULL. 语法 ISN ...

  5. mysql iif函数_sql中的iif语句详解_mysql

    IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(«Logical Expression», «Numeric Expression1», «Numeric Expressio ...

  6. php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念 js里常用的如下 - phpStudy...

    JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...

  7. SQL Server DBA工作内容详解

    原文:SQL Server DBA工作内容详解 在Microsoft SQL Server 2008系统中,数据库管理员(Database Administration,简称为DBA)是最重要的角色. ...

  8. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

  9. SQL Server 2005 常用数据类型详解

    SQL Server 2005 常用数据类型详解 [b]1. 字符串数据类型[/b] char 此数据类型可存储1~8000个定长字符串,字符串长度在创建时指定:如未指定,默认为char(1).每个字 ...

  10. SQL语句 SELECT LIKE用法详解

    在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...

最新文章

  1. 用@Data注解的形式替代类中的setter、getter方法
  2. 【vs开发】向图形界面程序添加控制台
  3. 你真的知道 NoSuchMethodError 发生原因和解决办法吗
  4. python16进制转2进制流_将十六进制文件转换为二进制文件
  5. python echo(msg) 字符串_[宜配屋]听图阁
  6. 华三云:不做开源的投机者
  7. dell加装固态硬盘_技术丨如何进行笔记本硬盘拆装?
  8. 【maven】maven入门以及maven常用命令
  9. hibernate 多对多注解配置
  10. BUG解决:RuntimeError:Given groups=1,weight of size...expected input...but got 3 channels instead.
  11. 【论文写作】课程指导平台的开发中系统流程如何写
  12. HbuilderX中 华为手机 真机调试
  13. 小米手环如何连接苹果手机
  14. 如何学习Android驱动开发
  15. vue部署到内网和外网配置简要说明
  16. 推荐一款远程控制软件Toesk。支持文件传输、高清画质、隐私屏、键盘鼠标映射等功能。
  17. 数学建模——规划问题
  18. javascript实用例子
  19. 车载CarPlay盒子的蓝牙应用案例
  20. 分析许嵩的175首歌曲,看看大家为什么那么喜欢听他的歌

热门文章

  1. 当一个好领导必须要具备的三大能力
  2. php 三才五格计算,姓名、名字笔划算命五格测试算命计算方法
  3. 公众号网页授权php,微信公众号里的PHP网站进行网页授权
  4. Windows打开热点断网解决方法
  5. WPF中资源字典引用出错
  6. WebSocket实现简单多人聊天
  7. 今天收到一封非常牛B的离职信
  8. ctf_backdoor
  9. python和mysql匹配吗_python使用mysql
  10. 阿里云ESC搭建SVN服务端-----实测有效,并补充了一些坑点