-- 开窗函数:在结果集的基础上进一步处理(聚合操作)
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.000 男 28
02 钱电 1990-12-21 00:00:00.000 男 28
03 孙风 1990-05-20 00:00:00.000 男 28
04 李云 1990-08-06 00:00:00.000 男 28
05 周梅 1991-12-01 00:00:00.000 女 28
06 吴兰 1992-03-01 00:00:00.000 女 28
07 郑竹 1989-07-01 00:00:00.000 女 28
08 王菊 1990-01-20 00:00:00.000 女 28
-- Over函数,添加一个字段显示总人数
SELECT *,COUNT(S#)OVER() 总人数 FROM dbo.Student
S# Sname Sage Ssex 总人数
---------- ---------- ----------------------- ---------- -----------
01 赵雷 1990-01-01 00:00:00.000 男 8
02 钱电 1990-12-21 00:00:00.000 男 8
03 孙风 1990-05-20 00:00:00.000 男 8
04 李云 1990-08-06 00:00:00.000 男 8
05 周梅 1991-12-01 00:00:00.000 女 8
06 吴兰 1992-03-01 00:00:00.000 女 8
07 郑竹 1989-07-01 00:00:00.000 女 8
08 王菊 1990-01-20 00:00:00.000 女 8
-- Partition By 分组统计数量
-- 根据性别分组后,统计
SELECT *,COUNT(*) OVER(PARTITION BY Ssex) 总数 FROM dbo.Student
S# Sname Sage Ssex 总数
---------- ---------- ----------------------- ---------- -----------
01 赵雷 1990-01-01 00:00:00.000 男 4
02 钱电 1990-12-21 00:00:00.000 男 4
03 孙风 1990-05-20 00:00:00.000 男 4
04 李云 1990-08-06 00:00:00.000 男 4
05 周梅 1991-12-01 00:00:00.000 女 4
06 吴兰 1992-03-01 00:00:00.000 女 4
07 郑竹 1989-07-01 00:00:00.000 女 4
08 王菊 1990-01-20 00:00:00.000 女 4
-- 根据性别分组后,统计、排序
SELECT *,COUNT(*) OVER(PARTITION BY Ssex ORDER BY Sname) 序号 FROM dbo.Student
S# Sname Sage Ssex 序号
---------- ---------- ----------------------- ---------- -----------
04 李云 1990-08-06 00:00:00.000 男 1
02 钱电 1990-12-21 00:00:00.000 男 2
03 孙风 1990-05-20 00:00:00.000 男 3
01 赵雷 1990-01-01 00:00:00.000 男 4
08 王菊 1990-01-20 00:00:00.000 女 1
06 吴兰 1992-03-01 00:00:00.000 女 2
07 郑竹 1989-07-01 00:00:00.000 女 3
05 周梅 1991-12-01 00:00:00.000 女 4
-- Over函数,添加一个字段显示平均年龄
SELECT *,AVG(DATEDIFF(yyyy,Sage,GETDATE()))OVER() 平均年龄 FROM dbo.Student
S# Sname Sage Ssex 平均年龄
---------- ---------- ----------------------- ---------- -----------
01 赵雷 1990-01-01 00:00:00.000 男 26
02 钱电 1990-12-21 00:00:00.000 男 26
03 孙风 1990-05-20 00:00:00.000 男 26
04 李云 1990-08-06 00:00:00.000 男 26
05 周梅 1991-12-01 00:00:00.000 女 26
06 吴兰 1992-03-01 00:00:00.000 女 26
07 郑竹 1989-07-01 00:00:00.000 女 26
08 王菊 1990-01-20 00:00:00.000 女 26
--Row_Rumber()
SELECT *,ROW_NUMBER()OVER(ORDER BY S# DESC) 序号 FROM dbo.Student
S# Sname Sage Ssex 序号
---------- ---------- ----------------------- ---------- --------------------
08 王菊 1990-01-20 00:00:00.000 女 1
07 郑竹 1989-07-01 00:00:00.000 女 2
06 吴兰 1992-03-01 00:00:00.000 女 3
05 周梅 1991-12-01 00:00:00.000 女 4
04 李云 1990-08-06 00:00:00.000 男 5
03 孙风 1990-05-20 00:00:00.000 男 6
02 钱电 1990-12-21 00:00:00.000 男 7
01 赵雷 1990-01-01 00:00:00.000 男 8
--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.000 男 1
02 钱电 1990-12-21 00:00:00.000 男 1
03 孙风 1990-05-20 00:00:00.000 男 1
04 李云 1990-08-06 00:00:00.000 男 1
05 周梅 1991-12-01 00:00:00.000 女 5
06 吴兰 1992-03-01 00:00:00.000 女 5
07 郑竹 1989-07-01 00:00:00.000 女 5
08 王菊 1990-01-20 00:00:00.000 女 5
--DENSE_Rank() 排名函数,名次相同不跳过
SELECT *,DENSE_RANK()OVER(ORDER BY Ssex) 名次 FROM dbo.Student
S# Sname Sage Ssex 名次
---------- ---------- ----------------------- ---------- --------------------
01 赵雷 1990-01-01 00:00:00.000 男 1
02 钱电 1990-12-21 00:00:00.000 男 1
03 孙风 1990-05-20 00:00:00.000 男 1
04 李云 1990-08-06 00:00:00.000 男 1
05 周梅 1991-12-01 00:00:00.000 女 2
06 吴兰 1992-03-01 00:00:00.000 女 2
07 郑竹 1989-07-01 00:00:00.000 女 2
08 王菊 1990-01-20 00:00:00.000 女 2
-- NTILE()函数,参数:记录总数/划分区域 = 每个区域数组,把记录序号放进数组 (平均分组)
SELECT *,NTILE(3)OVER(ORDER BY Ssex) 区域 FROM dbo.Student
S# Sname Sage Ssex 区域
---------- ---------- ----------------------- ---------- --------------------
01 赵雷 1990-01-01 00:00:00.000 男 1
02 钱电 1990-12-21 00:00:00.000 男 1
03 孙风 1990-05-20 00:00:00.000 男 1
04 李云 1990-08-06 00:00:00.000 男 2
05 周梅 1991-12-01 00:00:00.000 女 2
06 吴兰 1992-03-01 00:00:00.000 女 2
07 郑竹 1989-07-01 00:00:00.000 女 3
08 王菊 1990-01-20 00:00:00.000 女 3