SQL SEVER 开窗函数总结
作为一名刚刚入门的开发人员,要学的东西很多很多,有些无从下手。秉着“问题是病、技术是药、对症下药”的原则,将工作中遇到的问题所需的技术进行梳理、归纳和总结。
一、什么是开窗函数
首先,什么是开窗函数,与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口(这里的窗口是指运算将要操作的行的集合)。在开窗函数出现之前存在着很多用 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 开窗函数总结的更多相关文章
- SQL ServerOVER 子句,over开窗函数,SQL SERVER 开窗函数
https://technet.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx http://www.cnblogs.com/85538649 ...
- sql over开窗函数,
sql over开窗函数, 1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单 ...
- SQL SERVER开窗函数
作为一名开发人员来讲,我感觉在职场白混了好多年,可能是自己真的没有进取的精神吧,看了<程序员的SQL金典>这本电子书,真的让我学到了不少知识,真心喜欢这本电子书,书中讲解的内容比较好懂,也 ...
- SQL使用开窗函数与CTE查询每月销售额的前几名
WITH tagTab AS( SELECT YearMonth, pm=RANK() OVER(PARTITION BY YearMonth ORDER BY amount DESC) FROM S ...
- 【转】SQL SERVER 开窗函数简介
在SQL SERVER 2005/2008支持两种排名开窗函数和聚集开窗函数. 以SQL SERVER中分面页为例,按时间顺序列出定单号. WITH OrderInfo AS ( SELECT ROW ...
- SQL之开窗函数详解--可代替聚合函数使用
在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难 ...
- sql over开窗函数
1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单表(order)中统计中,生 ...
- Sql server 开窗函数over()的语法
用法一:与ROW_NUMBER()函数结合用,给结果进行排序编号,如图: 代码如下: SELECT ROW_NUMBER() over(order by RequiredDate) num ,* fr ...
- Sql Server 开窗函数Over()的使用
利用over(),将统计信息计算出来,然后直接筛选结果集 declare @t table( ProductID int, ProductName ), ProductType ), Price in ...
随机推荐
- MongoDB 3.4 安装以 Windows 服务方式运行
1.首先从https://www.mongodb.com/download-center#community 下载社区版,企业版也是类似. 2.双击运行安装,可自定义安装路径,这里采用默认路径(C:\ ...
- go语言开发教程之web项目开发实战
Golang介绍Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性.谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件 ...
- MariaDB xtrabackup物理备份与还原
xtrabackup物理备份 1.1 安装xtraback 安装依赖: [root@localhost ~]# yum install -y perl-DBD-MySQL perl-DBI perl- ...
- [dart学习]第一篇:windows下安装配置dart编译环境,写出helloworld
前言 博主非科班出身,平时多用C语言,最近想了解学习一门第二语言,看上了可用于移动开发的目前还小众一点dart,准备用一段比较长的时间来慢慢学习.理解. 关于dart语言不再详细介绍了,大家可以访问 ...
- @Override报错的处理
有时候我们从SVN导的项目,jre和jar包都没问题,但是就会出如下图的错误: xi 点击红叉,显示错误信息如下: 点击工具里面的window-->preferences-->java-- ...
- JS(JavaScript)的进一步了解2(更新中···)
js数据类型 基本数据类型:string undefined null boolean number 引用数据类型 Object array function 二者的区别 基本数据类 ...
- [亲测有效] - Linux安装PostgreSQL
本文章来为各位介绍一篇关于postgresql 9.4 在linux环境的安装步骤详解,希望文章能够对各位新手朋友带来帮助的哦. 环境说明系统:centos 6.4 64位软件:postgresq ...
- JQuery Checkbox 获取多选值 Checkbox选中个数
1.获取checkbox选中个数 $("input[name='ckb-jobid']:checked").length $("input[type='checkbox' ...
- out对象
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 全景拍摄,全景视频拍摄,全景VR拍摄,VR全景拍摄,360全景图片拍摄
北京动软专业提供基于手机.VR设备.PC浏览器的全景拍摄和项目展示服务. 承接服务内容包括720°全景拍摄展示.VR虚拟现实全景.全景漫游.全景视频.物体全景.环物全景等. 全景展示主要应用于展览 ...