博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql Server 开窗函数Over()的使用
阅读量:4641 次
发布时间:2019-06-09

本文共 2432 字,大约阅读时间需要 8 分钟。

利用over(),将统计信息计算出来,然后直接筛选结果集
1 declare @t table( 2 ProductID int, 3 ProductName varchar(20), 4 ProductType varchar(20), 5 Price int) 6   7 insert @t 8 select 1,'name1','P1',3 union all 9 select 2,'name2','P1',5 union all10 select 3,'name3','P2',4 union all11 select 4,'name4','P2',4

 

查询要求:查出每类产品中价格最高的信息
--做法一:找到每个组里,价格最大的值;然后再找出每个组里价格等于这个值的
--缺点:要进行一次join
    
select t1.* from @t t1  join (select ProductType, max(Price) Price from @t group by ProductType) t2   on t1.ProductType = t2.ProductType where t1.Price = t2.Price order by ProductType

 

--做法二:利用over(),将统计信息计算出来,然后直接筛选结果集。
--over() 可以让函数(包括聚合函数)与行一起输出。
 
;with cte as(select *, max(Price) over(partition by (ProductType)) MaxPrice from @t)select ProductID,ProductName,ProductType,Price from cte where Price = MaxPrice order by ProductType

 

-over() 的语法为:over([patition by ] <order by >)。需要注意的是,over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。
--over() 的另一常用情景是与 row_number() 一起用于分页。
现在来介绍一下开窗函数。
窗口函数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 ,OrderDateFrom 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/SmileIven/p/9109528.html

你可能感兴趣的文章
djang1.7 复制粘贴小项目(generic View的使用)
查看>>
Python For Delphi---更好地协同(续)
查看>>
Java的内存泄漏
查看>>
152-PHP htmlspecialchars函数
查看>>
061-PHP函数定义默认参数
查看>>
社交列表的添加【js、DOM】
查看>>
Genymotion下载模拟器失败解决方案
查看>>
The Apostrophe and the Quote Function ‘和引用函数 未翻译完)
查看>>
win8开发入门——国际化(多语言支持)
查看>>
科学计算三维可视化---Mayavi入门(Mayavi库的基本元素和绘图实例)
查看>>
2018 ACM-ICPC 焦作网络赛
查看>>
Codeforces 871D Paths (欧拉函数 + 结论)
查看>>
C#类似版本号有多个分割符可以产生的排列组合,类似版本号比较
查看>>
暴力贪心+预处理自动机——cf990E
查看>>
VS C#程序打包覆盖安装不能更新的解决方法
查看>>
java项目部署常用linux命
查看>>
Codeforces 1114D(区间DP)
查看>>
python-封装方法用于读取excel
查看>>
从零开始学android开发-项目打包发布
查看>>
你真的理解微服务架构吗
查看>>