SQL Server - 开窗函数

    xiaoxiao2021-03-26  33

    -- 开窗函数:在结果集的基础上进一步处理(聚合操作) 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

    转载请注明原文地址: https://ju.6miu.com/read-662934.html

    最新回复(0)