SQL Server - 开窗函数

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

SELECT * FROM dbo.Student

S#         Sname      Sage                    Ssex
---------- ---------- ----------------------- ----------
01         赵雷         1990-01-01 00:00:00.00002         钱电         1990-12-21 00:00:00.00003         孙风         1990-05-20 00:00:00.00004         李云         1990-08-06 00:00:00.00005         周梅         1991-12-01 00:00:00.00006         吴兰         1992-03-01 00:00:00.00007         郑竹         1989-07-01 00:00:00.00008         王菊         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.0002                    07         郑竹         1989-07-01 00:00:00.0003                    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

你可能感兴趣的:(DataBase)