在SQL SERVER 2005/2008支持两种排名开窗函数和聚集开窗函数。

以SQL SERVER中分面页为例,按时间顺序列出定单号。

WITH OrderInfo AS

(

SELECT ROW_NUMBER() OVER(ORDER BY OrderDate) AS Number,

OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)

)

SELECT Number,OrderID,CustomerID, EmployeeID ,OrderDate

From OrderInfo WHERE Number BETWEEN 0 AND 10

其中ROW_NUMBER()就是排名函数,OVER()就是窗口函数。

窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。

开窗函数不需要使用GROUP BY就可以对数据进行分组,还可以同时返回基础行的列和聚合列。

1.排名开窗函数

ROW_NUMBER、DENSE_RANK、RANK、NTILE属于排名函数。

排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。

PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。

ODER BY 指定排名开窗函数的顺序。在排名开窗函数中必须使用ORDER BY语句。

例如查询每个雇员的定单,并按时间排序

WITH OrderInfo AS

(

SELECT ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY OrderDate) AS Number,

OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)

)

SELECT Number,OrderID,CustomerID, EmployeeID ,OrderDate

From OrderInfo WHERE Number BETWEEN 0 AND 10

窗口函数根据PARTITION BY语句按雇员ID对数据行分组,然后按照ORDER BY 语句排序,排名函数ROW_NUMBER()为每一组的数据分从1开始生成一个序号。

ROW_NUMBER()为每一组的行按顺序生成一个唯一的序号

RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。

DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。也就是说如果两个相同的行生成序号3,那么接下来生成的序号还是4。

NTILE (integer_expression) 按照指定的数目将数据进行分组,并为每一组生成一个序号。

2.聚合开窗函数

很多聚合函数都可以用作窗口函数的运算,如SUM,AVG,MAX,MIN。

聚合开窗函数只能使用PARTITION BY子句或都不带任何语句,ORDER BY不能与聚合开窗函数一同使用。

例如,查询雇员的定单总数及定单信息

WITH OrderInfo AS

(

SELECT COUNT(OrderID) OVER(PARTITION BY EmployeeID) AS TotalCount,OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)

)

SELECT OrderID,CustomerID, EmployeeID ,OrderDate,TotalCount

From OrderInfo ORDER BY EmployeeID

如果窗口函数不使用PARTITION BY 语句的话,那么就是不对数据进行分组,聚合函数计算所有的行的值。

WITH OrderInfo AS

(

SELECT COUNT(OrderID) OVER() AS Count,OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)

)

转载于:https://www.cnblogs.com/gates/p/4149176.html

【转】SQL SERVER 开窗函数简介相关推荐

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

    利用over(),将统计信息计算出来,然后直接筛选结果集 1 declare @t table( 2 ProductID int, 3 ProductName varchar(20), 4 Produ ...

  2. SQL Server Len() 函数

    SQL Server Len() 函数简介: LEN() 函数用于输入字符串的字符数. LEN() 函数返回输入字符串的字符数,不包括尾随空格. 以下是LEN() 函数的语法: LEN(input_s ...

  3. php charindex,SQL Server Charindex()函数

    在本教程中,将学习如何使用SQL Server CHARINDEX()函数来搜索字符串中的子字符串. SQL Server CHARINDEX()函数简介 SQL Server CHARINDEX() ...

  4. mysql的datepart函数,SQL Server Datepart()函数

    在本教程中,将学习如何使用SQL Server DATEPART()函数来提取日期的一部分. SQL Server DATEPART()函数简介 DATEPART()函数返回一个整数,它是日期的一部分 ...

  5. SQL Server用户自定义函数

    用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统 函 数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过 EXECUTE 命令来执行.在 SQL Server 中根据 ...

  6. SQL Server CONVERT() 函数,Date 函数

    From: http://www.w3school.com.cn/sql/func_convert.asp 定义和用法 CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() ...

  7. SQL Server日期函数集合

    SQL Server日期函数集合--1:获取系统日期和时间值函数 --getdate() SELECT GETDATE() AS 'today' --getutcdate() SELECT GETUT ...

  8. sql server 自定义函数的使用

    sql server 自定义函数的使用 自定义函数 用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回 用户自定义函数的类型: 标量函数:返回一个标量值 表格值函数{内联表格值函 ...

  9. sql server charindex函数和patindex函数详解(转)

    charindex和patindex函数常常用来在一段字符中搜索字符或字符串.假如被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数. ...

最新文章

  1. 闻声识人时代将至?多家企业争相布局
  2. 成功解决No handles with labels found to put in legend.
  3. kubernetes使用ansible快速构建集群
  4. flume案例-flume级联-配置文件编写
  5. 队列的定义与操作-顺序存储,链式存储(C语言)
  6. jq之$(“p:first“)
  7. 先学Oracle还是Java,事前学习过的java和Oracle笔记没删除的都带过来
  8. ERR! sharp EACCES: permission denied, mkdir ‘/root/.npm/_libvips‘......
  9. linux主机重启之后,报UNEXPECTED INCOMSISTEMCY:RUN fsck MANUALLY.
  10. Android粒子爆炸特效[可用于任意控件]
  11. 新版软著申请系统说明
  12. scala 转换、过滤、分组、排序
  13. 4G内存适合装哪个版本matlab,4G内存装win7 32位还是64位|单条4G内存选32位还是64位系统性能实测...
  14. JavaScript 每日一题 #6
  15. Fragstats景观分析研究
  16. TCP粘包/拆包问题
  17. Win10提示“为了对电脑进行保护,已经阻止此应用”怎么处理?
  18. ZOJ2477 拼魔方
  19. python 从大图中找小图
  20. kestrel服务器性能,深入理解kestrel的应用

热门文章

  1. native react 常用指令_React Native 常用命令或快捷键合集
  2. c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)
  3. android webview 多次加载,android – 重复webview,我想在每个加载相同
  4. .sh是什么语言_为什么《山海经·中次二经》中,把“西王母”叫做“马腹”?...
  5. python命令解析_python学习(命令行的解析)
  6. 用vscode创建一个c项目_Visual Studio Code创建C#项目
  7. ubuntu下使用yocto制作龙芯文件系统
  8. 机器学习解决问题思路 — 词嵌入矩阵E对于NLP问题的重要性
  9. 高薪诚聘项目经理,架构师,高级工程师,工程师,网页设计师
  10. 【Django】(3)创建网页:学习笔记主页