SQL Server - 开窗函数

时间:2023-03-09 19:49:18
SQL Server - 开窗函数

-- 开窗函数:在结果集的基础上进一步处理(聚合操作)

SELECT * FROM dbo.Student

S#         Sname      Sage                    Ssex
---------- ---------- ----------------------- ----------
01 赵雷 1990-01-01 00:00:00.000
02 钱电 1990-12-21 00:00:00.000
03 孙风 1990-05-20 00:00:00.000
04 李云 1990-08-06 00:00:00.000
05 周梅 1991-12-01 00:00:00.000
06 吴兰 1992-03-01 00:00:00.000
07 郑竹 1989-07-01 00:00:00.000
08 王菊 1990-01-20 00:00:00.000 女 -- Over函数,添加一个字段显示最大年龄
SELECT *,MAX(DATEDIFF(yyyy,Sage,GETDATE()))OVER() MaxSage FROM dbo.Student S# Sname Sage Ssex MaxSage
---------- ---------- ----------------------- ---------- -----------
01 赵雷 1990-01-01 00:00:00.00028
02 钱电 1990-12-21 00:00:00.00028
03 孙风 1990-05-20 00:00:00.00028
04 李云 1990-08-06 00:00:00.00028
05 周梅 1991-12-01 00:00:00.00028
06 吴兰 1992-03-01 00:00:00.00028
07 郑竹 1989-07-01 00:00:00.00028
08 王菊 1990-01-20 00:00:00.00028 -- Over函数,添加一个字段显示总人数
SELECT *,COUNT(S#)OVER() 总人数 FROM dbo.Student S# Sname Sage Ssex 总人数
---------- ---------- ----------------------- ---------- -----------
01 赵雷 1990-01-01 00:00:00.0008
02 钱电 1990-12-21 00:00:00.0008
03 孙风 1990-05-20 00:00:00.0008
04 李云 1990-08-06 00:00:00.0008
05 周梅 1991-12-01 00:00:00.0008
06 吴兰 1992-03-01 00:00:00.0008
07 郑竹 1989-07-01 00:00:00.0008
08 王菊 1990-01-20 00:00:00.0008 -- Partition By 分组统计数量
-- 根据性别分组后,统计
SELECT *,COUNT(*) OVER(PARTITION BY Ssex) 总数 FROM dbo.Student S# Sname Sage Ssex 总数
---------- ---------- ----------------------- ---------- -----------
01 赵雷 1990-01-01 00:00:00.0004
02 钱电 1990-12-21 00:00:00.0004
03 孙风 1990-05-20 00:00:00.0004
04 李云 1990-08-06 00:00:00.0004
05 周梅 1991-12-01 00:00:00.0004
06 吴兰 1992-03-01 00:00:00.0004
07 郑竹 1989-07-01 00:00:00.0004
08 王菊 1990-01-20 00:00:00.0004 -- 根据性别分组后,统计、排序
SELECT *,COUNT(*) OVER(PARTITION BY Ssex ORDER BY Sname) 序号 FROM dbo.Student S# Sname Sage Ssex 序号
---------- ---------- ----------------------- ---------- -----------
04 李云 1990-08-06 00:00:00.0001
02 钱电 1990-12-21 00:00:00.0002
03 孙风 1990-05-20 00:00:00.0003
01 赵雷 1990-01-01 00:00:00.0004
08 王菊 1990-01-20 00:00:00.0001
06 吴兰 1992-03-01 00:00:00.0002
07 郑竹 1989-07-01 00:00:00.0003
05 周梅 1991-12-01 00:00:00.0004 -- Over函数,添加一个字段显示平均年龄
SELECT *,AVG(DATEDIFF(yyyy,Sage,GETDATE()))OVER() 平均年龄 FROM dbo.Student S# Sname Sage Ssex 平均年龄
---------- ---------- ----------------------- ---------- -----------
01 赵雷 1990-01-01 00:00:00.00026
02 钱电 1990-12-21 00:00:00.00026
03 孙风 1990-05-20 00:00:00.00026
04 李云 1990-08-06 00:00:00.00026
05 周梅 1991-12-01 00:00:00.00026
06 吴兰 1992-03-01 00:00:00.00026
07 郑竹 1989-07-01 00:00:00.00026
08 王菊 1990-01-20 00:00:00.00026 --Row_Rumber()
SELECT *,ROW_NUMBER()OVER(ORDER BY S# DESC) 序号 FROM dbo.Student S# Sname Sage Ssex 序号
---------- ---------- ----------------------- ---------- --------------------
08 王菊 1990-01-20 00:00:00.0001
07 郑竹 1989-07-01 00:00:00.0002
06 吴兰 1992-03-01 00:00:00.0003
05 周梅 1991-12-01 00:00:00.0004
04 李云 1990-08-06 00:00:00.0005
03 孙风 1990-05-20 00:00:00.0006
02 钱电 1990-12-21 00:00:00.0007
01 赵雷 1990-01-01 00:00:00.0008 --Row_Rumber() 实现分页效果
WITH T AS (
SELECT ROW_NUMBER() OVER ( ORDER BY S# DESC ) RowNumber ,*
FROM dbo.Student
)
SELECT * FROM T WHERE T.RowNumber BETWEEN 1 AND 3 RowNumber S# Sname Sage Ssex
-------------------- ---------- ---------- ----------------------- ----------
1 08 王菊 1990-01-20 00:00:00.000
2 07 郑竹 1989-07-01 00:00:00.000
3 06 吴兰 1992-03-01 00:00:00.000 女 --Rank() 排名函数,名次相同,跳过
SELECT *,RANK()OVER(ORDER BY Ssex) 名次 FROM dbo.Student
S# Sname Sage Ssex 名次
---------- ---------- ----------------------- ---------- --------------------
01 赵雷 1990-01-01 00:00:00.0001
02 钱电 1990-12-21 00:00:00.0001
03 孙风 1990-05-20 00:00:00.0001
04 李云 1990-08-06 00:00:00.0001
05 周梅 1991-12-01 00:00:00.0005
06 吴兰 1992-03-01 00:00:00.0005
07 郑竹 1989-07-01 00:00:00.0005
08 王菊 1990-01-20 00:00:00.0005 --DENSE_Rank() 排名函数,名次相同不跳过
SELECT *,DENSE_RANK()OVER(ORDER BY Ssex) 名次 FROM dbo.Student S# Sname Sage Ssex 名次
---------- ---------- ----------------------- ---------- --------------------
01 赵雷 1990-01-01 00:00:00.0001
02 钱电 1990-12-21 00:00:00.0001
03 孙风 1990-05-20 00:00:00.0001
04 李云 1990-08-06 00:00:00.0001
05 周梅 1991-12-01 00:00:00.0002
06 吴兰 1992-03-01 00:00:00.0002
07 郑竹 1989-07-01 00:00:00.0002
08 王菊 1990-01-20 00:00:00.0002 -- NTILE()函数,参数:记录总数/划分区域 = 每个区域数组,把记录序号放进数组 (平均分组)
SELECT *,NTILE(3)OVER(ORDER BY Ssex) 区域 FROM dbo.Student S# Sname Sage Ssex 区域
---------- ---------- ----------------------- ---------- --------------------
01 赵雷 1990-01-01 00:00:00.0001
02 钱电 1990-12-21 00:00:00.0001
03 孙风 1990-05-20 00:00:00.0001
04 李云 1990-08-06 00:00:00.0002
05 周梅 1991-12-01 00:00:00.0002
06 吴兰 1992-03-01 00:00:00.0002
07 郑竹 1989-07-01 00:00:00.0003
08 王菊 1990-01-20 00:00:00.0003