SqlServer窗口函数

窗口函数的作用

窗口函数是对一组值进行操作,不需要使用group by子句对数据进行分组,还能够在同一行中同时返回基础行的列和聚合列。窗口函数,基础列和聚合列的查询都非常简单。

语法格式

窗口函数的语法格式如下:

over([partition by value_expression,...,[n]],<order by by\_value>)
  • partition by:分组
  • order by:排序

首先创建一张测试表:

CREATE TABLE [dbo].[Scores](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [StudentId] [int] NULL,
    [CSharp] [float] NULL,
    [SqlServer] [float] NULL,
    [C语言] [float] NULL
)

表中数据如下:
这里写图片描述

应用实例

1、avg()求平均值:

/*用group by分组
 */
SELECT StudentId, CSharp, AVG(CSharp) AS '平均分' FROM Scores group by StudentId,CSharp

这里写图片描述

/*用over()分组,group by可省略
 *partition by studentid,CSharp 表示按studentid,CSharp分组
 */
SELECT StudentId,CSharp,AVG(csharp) over(partition by studentid,CSharp) AS '平均分' from Scores

这里写图片描述

/*用over()分组,group by可省略
 *默认情况下所有数据为同一分组
 */
SELECT StudentId, CSharp, AVG(CSharp) over() AS '平均分' FROM Scores 

这里写图片描述

/*用over()分组,group by可省略
 *partition by StudentId表示按StudentId分组
 */
SELECT StudentId, CSharp, AVG(CSharp) over(partition by StudentId) AS '平均分' FROM Scores 

这里写图片描述

2、cast()转换数据格式
语法格式:cast(原数据 as 新格式)

/*用group by分组
 *将avg(CSharp)转换为decimal(5,2)格式
 */
select StudentId,CSharp,cast(AVG(csharp) as decimal(5,2)) as'平均分' from Scores group by StudentId,CSharp

这里写图片描述

/*用over()分组,group by可省略
 *partition by studentid,CSharp表示按studentid,CSharp分组
 *将avg(CSharp)转换为decimal(5,2)格式
 */
select StudentId,CSharp,cast(AVG(csharp) over(partition by studentid,CSharp) as decimal(5,2)) as'平均分' from Scores

这里写图片描述

/*用over()分组,group by可省略
 *默认情况下所有数据为同一分组
 *将avg(CSharp)转换为decimal(5,2)格式
 */
select StudentId,CSharp,cast(AVG(csharp) over() as decimal(5,2)) as'平均分' from Scores

这里写图片描述

/*用over()分组,group by可省略
 *partition by studentid表示按studentid分组
 *将avg(CSharp)转换为decimal(5,2)格式
 */
select StudentId,CSharp,cast(AVG(csharp) over(partition by studentid) as decimal(5,2)) as'平均分' from Scores

这里写图片描述

3、row_number()创建列编号

select row_number() over(partition by StudentId order by CSharp asc) as rowNumber,StudentId,CSharp from Scores

这里写图片描述

需求:按照岗位Job分类,查询出每种岗位的最高工资是多少、哪个人拿到了这份工资
示例数据如下:
这里写图片描述

/*row_number()按照Job分类,然后根据Salary降序排列,这样RowNumber=1的行就是工资最高的那一条数据*/
select * from 
(select ROW_NUMBER()over(partition by Job order by Salary desc,Id asc)as RowNumber,EmployeeName,Job,Salary from Employee)a 
where RowNumber=1;

运行截图如下:
这里写图片描述
4、rank()排序
返回结果集的分区内每行数据的顺序,行的排名是从1开始算。如果两个或多个行的数据相同,则每个关联行将得到相同的排名。

select rank() over(partition by StudentId order by CSharp),StudentId,CSharp from dbo.Scores

这里写图片描述

select rank() over(order by CSharp),StudentId,CSharp from dbo.Scores

这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

changuncle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值