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

利用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 all
10 select 3,'name3','P2',4 union all
11 select 4,'name4','P2',4

 

查询要求:查出每类产品中价格最高的信息

--做法一:找到每个组里,价格最大的值;然后再找出每个组里价格等于这个值的
--缺点:要进行一次join
    
select t1.* from @t t1join (select ProductType, max(Price) Price from @t group by ProductType) t2 on t1.ProductType = t2.ProductTypewhere t1.Price = t2.Priceorder 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 = MaxPriceorder 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 ,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/SmileIven/p/9109528.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云栖科技评论第48期:前沿科技对世界的改造 我们这代人只完成了1%

1、数字经济版图呈中美双分趋势 日本IT行业为前景担忧 数字经济版图呈中美双分趋势 日本IT行业为前景担忧 【新闻摘要】《日本经济新闻》日前刊文称&#xff0c;数字经济的势力版图呈现中国和美国两强双分的趋势明显&#xff0c;这意味着日本可能不得不使用中美的技术&#xff…

程序员犯的非技术错误(Top 5)

对于程序开发者来说&#xff0c;有两种技术需要我们掌握&#xff0c;一个是技术上的能力&#xff0c;另一个是非技术上的能力。不幸的是&#xff0c;许多程序员过多地关注了技术上的能力&#xff0c;而忽略了非技术上的能力的培养&#xff0c;因此&#xff0c;我们的程序员们经…

CentOS下添加Root权限用户‘超级用户’方法(xxx is not in the sudoers file.This incident will be reported.的解决方法)

文章目录1.添加普通用户2.添加sudo文件的写权限3.编辑sudoers文件4.撤销sudoers文件写权限1.添加普通用户 [rootserver ~]# useradd fxd //添加一个名为fxd的用户 [rootserver ~]# passwd fxd //修改密码 Changing password for user chenjiafa. New UNIX password: //在这里输…

android打印intent flag,Android flag详解

Android flag详解Android flag详解一.Flag标志位在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志&#xff0c;增加标志或者去除标志。如&#xff1a;二.addFlags (int flags)和setFlags (int flags)区别Public Intent addFlags (int flags)增加额外…

人机界面设计

1.系统响应时间 系统响应时间指从用户完成某个控制动作(例如&#xff0c;按回车键或单击鼠标)&#xff0c;到软件给出预期的响应(输出信息或做动作)之间的这段时间。 系统响应时间有两个重要属性&#xff0c;分别是长度和易变性。 1&#xff09;长度&#xff1a;时间过长&#…

GeoHash资料

geohash基本原理 转载于:https://www.cnblogs.com/hyl8218/p/9111410.html

开启市场新格局 且看新华三计算与存储新品发布会

全球领先的新IT解决方案领导者新华三将于8月31日在北京钓鱼台国宾馆举办“新IT 新动能 新格局 新华三下一代计算与存储发布会”&#xff0c;重磅发布服务器和存储的全线新品。 2017年初&#xff0c;新华三集团正式推出了“应用驱动 云领未来”的新IT战略。在这一战略指引下&…

Centos7更新 SQLite3至版本3.29.0

文章目录1.创建 src 目录并进到这个目录2.下载 sqlite3 源码并解压安装3.替换系统低版本 sqlite31.创建 src 目录并进到这个目录 fxd用户下&#xff1a; mkdir -p ~/src cd ~/src 2.下载 sqlite3 源码并解压安装 fxd用户下&#xff1a; wget https://sqlite.org/2019/sqlite…

开发人员必学的5门课程

越来越多的Web开发人员通常都会问一些同样的问题。比如&#xff1a;哪一种开发语言最重要&#xff1f;初级开发人员的薪金会是多少&#xff1f;公司提供的免费培训有用吗&#xff1f;如何评估一个新的项目&#xff1f;尽管这些问题都很重要&#xff0c;但是开发人员往往对其他人…

android 响应类型,android – Retrofit 2 RxJava – Gson – “全局”反序列化,更改响应类型...

正如Than所说,使用拦截器的解决方案并不是那么好.我已经设法用一个Rx变压器来解决这个问题.我还添加了自定义api异常,当出现问题时我可以抛出它并在onError中轻松处理它.我认为它更强大.响应包装器&#xff1a;public class ApiResponse {private boolean success;private T da…

龟兔赛跑问题

题目 乌龟与兔子进行赛跑&#xff0c;跑场是一个矩型跑道&#xff0c;跑道边可以随地进行休息。乌龟每分钟可以前进3米&#xff0c;兔子每分钟前进9米&#xff1b;兔子嫌乌龟跑得慢&#xff0c;觉得肯定能跑赢乌龟&#xff0c;于是&#xff0c;每跑10分钟回头看一下乌龟&#x…

过程设计的工具

描述程序处理过程的工具称为过程设计工具&#xff0c;它可以分为图形、表格和语言3类。不论是那类工具&#xff0c;对他们的基本要求都是提供对设计 无歧义的描述&#xff0c;也就是应该能够指明控制流程、处理功能、数据组织以及其他方面的实现细节。从而在编码阶段能够把对应…

Centos7中安装python3.7、pip3以及pipenv(亲测有效)

文章目录1.安装python3.7以及pip32.使用pip3安装pipenv时pip报错3.使用pip3安装pipenv时出现ReadTimeoutError4.查看pipenv版本报错1.安装python3.7以及pip3 1)首先来安装依赖 yum -y install gcc gcc-c yum -y groupinstall “Development tools” yum install openssl-deve…

成功人士都是这样逼出来的

研究过很多很多成功人士的成才之路&#xff0c;发现这些人和我们普通人其实没有什么区别&#xff0c;不过&#xff0c;这些人用老祖宗的话说是“天将降大任于斯人也&#xff0c;必将苦其心志&#xff0c;劳其筋骨&#xff0c;饿其体肤&#xff0c;空乏其身&#xff0c;所以动心…

Linux下网卡绑定模式

Linux bonding驱动一共提供了7种模式&#xff0c;它们分别是&#xff1a;balance-rr 、active-backup、balance-xor、broadcast、802.3ad、balance-tlb、balance-alb。 balance-rr or 0&#xff1a;轮询模式&#xff0c;提供负载平衡和容错。该模式下两个网口都工作 active-…

Unity4.6证书激活问题

第一次运行的激活问题安装好Unity4.6之后首次启动会自动连网&#xff0c;但是会出现error loading page错误&#xff0c;SSL peer certificate or SSH remote key was not OK。如下图所示&#xff1a; 点OK就退出了。再启动一遍也是一样的。 这时可以先暂时断一下网&#xff0c…

Readhat中挂载yum源

文章目录1.链接物理镜像2.查看原始挂载目录3.挂载4.新建iso.repo5.查看挂载目录1.链接物理镜像 vmware控制台中&#xff0c;勾选设备状态成“已连接”&#xff0c;会在桌面生成镜像图标。 2.查看原始挂载目录 输入以下指令&#xff1a; [rootlocalhost ~]# df -h Filesystem…

面向数据结构设计的基本思想

Jackson 方法的软件设计过程是从数据结构入手&#xff0c;由数据结构之间的关系导出程序结构&#xff0c;这使软件系统的开发“有章可循”。尤其这一方法特别适合于以数据为主&#xff0c;“计算”较简单的数据处理系统。因此可称其为“面向数据的方法”。由于这一技术未提供对…

html图片分四面切割播,CSS3切割轮播图

* {margin:0;padding:0;}.view {width:560px;height:300px;margin:200px auto;position:relative;}.box {width:100%;height:100%;list-style:none;background-color:black;position:absolute;/* 开启3d效果 */transform-style:preserve-3d;}.box li {width:25%;height:100%;po…

知其所以然地学习(以算法学习为例)

其实下文的绝大部分内容对所有学习都是同理的。只不过最近在正儿巴经地学算法&#xff0c;而后者又不是好啃的骨头&#xff0c;所以平时思考总结得就自然要比学其它东西要多一些。 问题&#xff1a;目前几乎所有的算法书的讲解方式都是欧几里德式的、瀑布式的、自上而下的、每…