作为一名刚刚入门的开发人员,要学的东西很多很多,有些无从下手。秉着“问题是病、技术是药、对症下药”的原则,将工作中遇到的问题所需的技术进行梳理、归纳和总结。

一、什么是开窗函数

首先,什么是开窗函数,与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口(这里的窗口是指运算将要操作的行的集合)。在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。下面举例说明:

现在有这样的要求:查询成绩在90分以下的学生信息,并在每行显示低于90分的学生总数。

通过使用子查询我们可以得出查询结果,代码如下:

SELECT  NAME ,
AGE ,
SCORES ,
( SELECT COUNT(NAME)
FROM Table_1
WHERE SCORES <
)
FROM Table_1
WHERE SCORES < ;

虽然使用子查询能够解决这个问题,但是当数据结构很复杂时,子查询的使用非常麻烦,使用开窗函数则大大简化了查询逻辑,以下代码将展示使用开窗函数得到同样的查询结果:

SELECT  NAME ,
AGE ,
SCORES ,
COUNT(NAME) OVER ( )
FROM Table_1
WHERE SCORES < ;

通过以上例子,我们可以看到使用开窗函数可以解决一些需要通过复杂的相关子查询或者存储过程来实现的查询。与聚合函数不同的是,开窗函数在聚合函数后增加了一个OVER关键字。
开窗函数的调用格式为:函数名(列) OVER(选项)        OVER 关键字表示把函数当成开窗函数而不是聚合函数。SQL  标准允许将所有聚合函数用做开窗函数,使用OVER 关键字来区分这两种用法。


二、开窗函数分类

开窗函数可分为:聚合开窗函数排序开窗函数两种

2.1 聚合开窗函数

在上述例子中,我们所使用的就是聚合开窗函数。OVER关键字后的括号中可以为空,也可以使用 PARTITION BY 子句来定义行的分区来供进行聚合计算。下面的SQL语句使用“AGE”进行分区, 用于查询学生的年龄分布以及相同年龄的学生的个数。

SELECT  DISTINCT
AGE ,
COUNT(NAME) OVER ( PARTITION BY AGE )
FROM Table_1;

  2.2 排序开窗函数

使用较为频繁的排序开窗函数有:ROW_NUMBER(行号)、RANK(排名)、DENSE_RANK(密集排名)和NTILE(分组排名)。

还是上面的例子,现提出如下要求:查询成绩排名第2的学生信息。这里我们就可以使用ROW_NUMBER(行号)函数来实现查询目的。代码如下:

SELECT  *
FROM ( SELECT NAME ,
AGE ,
SCORES ,
ROW_NUMBER() OVER ( ORDER BY SCORES DESC ) AS rownum
FROM Table_1
) T
WHERE T.rownum = ;

  其他排序开窗函数原理与ROW_NUMBER类似,根据不同需求选择使用哪种开窗函数。但是需要注意一点的是,在排序开窗函数中使用PARTITION BY子句需要放置在ORDER BY子句之前。


三、总结

  本文对开窗函数进行了简要介绍,并对如何使用开窗函数进行了说明。正确的使用开窗函数可以有效的提高查询效率,优化查询逻辑,但就像开篇提到的“问题是病、技术是药、对症下药”,只有针对合适的问题使用合适的技术,才能事半功倍。

  

SQL SEVER 开窗函数总结的更多相关文章

  1. SQL ServerOVER 子句,over开窗函数,SQL SERVER 开窗函数

    https://technet.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx http://www.cnblogs.com/85538649 ...

  2. sql over开窗函数,

    sql over开窗函数, 1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单 ...

  3. SQL SERVER开窗函数

    作为一名开发人员来讲,我感觉在职场白混了好多年,可能是自己真的没有进取的精神吧,看了<程序员的SQL金典>这本电子书,真的让我学到了不少知识,真心喜欢这本电子书,书中讲解的内容比较好懂,也 ...

  4. SQL使用开窗函数与CTE查询每月销售额的前几名

    WITH tagTab AS( SELECT YearMonth, pm=RANK() OVER(PARTITION BY YearMonth ORDER BY amount DESC) FROM S ...

  5. 【转】SQL SERVER 开窗函数简介

    在SQL SERVER 2005/2008支持两种排名开窗函数和聚集开窗函数. 以SQL SERVER中分面页为例,按时间顺序列出定单号. WITH OrderInfo AS ( SELECT ROW ...

  6. SQL之开窗函数详解--可代替聚合函数使用

    在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难 ...

  7. sql over开窗函数

    1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单表(order)中统计中,生 ...

  8. Sql server 开窗函数over()的语法

    用法一:与ROW_NUMBER()函数结合用,给结果进行排序编号,如图: 代码如下: SELECT ROW_NUMBER() over(order by RequiredDate) num ,* fr ...

  9. Sql Server 开窗函数Over()的使用

    利用over(),将统计信息计算出来,然后直接筛选结果集 declare @t table( ProductID int, ProductName ), ProductType ), Price in ...

随机推荐

  1. Navicat Premium 简体中文版 12.0.16 以上版本国外官网下载地址(非国内)

    国内Navicat网址是:http://www.navicat.com.cn 国外Navicat网址是:http://www.navicat.com 国外的更新比国内的快,而且同一个版本,国内和国外下 ...

  2. shell的打印菜单

    #!/bash/bin cat  << EOF   #EOF是变量,可随便设置,但标准是EOF 1)hello world. 2)你好,世界. EOF

  3. sqflite插件简单使用 key======================

    https://blog.csdn.net/weixin_34183910/article/details/86029912 https://blog.csdn.net/u013255127/arti ...

  4. jmeter的新增函数说明

    本文算是对<零成本实现Web性能测试:基于Apache JMeter>中的<详解JMeter函数和变量>进行狗尾续貂哈,因为最近版本的jmeter增加了几个新函数,在原书中没有 ...

  5. uirecorder 启动webdriver服务报错

    在安装好uirecorder后,执行起来是各种错误. 不是少这个就是缺那个,也是因为自己对自动化测试知识太匮乏. 导致刚开始走自动化测试绕了很多弯路,报个错都不知所措.后来才知道要多看ERROR后面的 ...

  6. iOS imageNamed 与 imageWithContentsOfFile 的区别

    imageNamed 方法 1)后面的参数是icon的名字,图片可以存在项目中,也可以存在Asset中 2)该方法只适合一些中小型的图片读取,而一些比较大的资源图片并不适合用这个方法 3)这个方法加载 ...

  7. C# 模拟 HTTP POST请求

    /// <summary> /// 用于以 POST 方式向目标地址提交表达数据 /// 使用 application/x-www-form-urlencoded 编码方式 /// 不支持 ...

  8. JS高程12.2.3元素大小的学习笔记

    <JavaScript高级程序设计>中讲述了通过JS如何控制页面中元素的大小,其中涉及到三对属性:偏移量,客户区大小,滚动大小.以前自己经常看到这三对属性,但是具体不是很清楚,容易混淆.所 ...

  9. LaTex Verbatim 环境下使用数学符号

    参考: Write math and make a box with alltt environment LaTex Verbatim 环境下使用数学符号 在 Verbatim 环境下使用数学符号,需 ...

  10. ios高级开发之多线程(三)GCD技术

    GCD是基于C的API,它是libdispatch的的市场名称.而libdispatch作为Apple公司的一个库,为并发代码在多核硬件(跑IOS或者OS X)上执行提供有力支持. 那么我们为什么要用 ...