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

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

SQL Server - 开窗函数的更多相关文章

  1. SQL ServerOVER 子句,over开窗函数,SQL SERVER 开窗函数

    https://technet.microsoft.com/zh-cn/library/ms189461(v=sql.105).aspx http://www.cnblogs.com/85538649 ...

  2. 【转】SQL SERVER 开窗函数简介

    在SQL SERVER 2005/2008支持两种排名开窗函数和聚集开窗函数. 以SQL SERVER中分面页为例,按时间顺序列出定单号. WITH OrderInfo AS ( SELECT ROW ...

  3. SQL SERVER开窗函数

    作为一名开发人员来讲,我感觉在职场白混了好多年,可能是自己真的没有进取的精神吧,看了<程序员的SQL金典>这本电子书,真的让我学到了不少知识,真心喜欢这本电子书,书中讲解的内容比较好懂,也 ...

  4. Sql server 开窗函数over()的语法

    用法一:与ROW_NUMBER()函数结合用,给结果进行排序编号,如图: 代码如下: SELECT ROW_NUMBER() over(order by RequiredDate) num ,* fr ...

  5. Sql Server 开窗函数Over()的使用

    利用over(),将统计信息计算出来,然后直接筛选结果集 declare @t table( ProductID int, ProductName ), ProductType ), Price in ...

  6. SQL Server开窗函数之OVER子句、PARTITION BY 子句

    开窗函数与聚合函数一样,都是对行的集合组进行聚合计算.它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同 ...

  7. SQL Server 聚合函数算法优化技巧

    Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期.Sql server聚合函数对一组值 ...

  8. SQL Server排序函数row_number和rank的区别

    SQL Server排序函数row_number和rank的区别 直接看测试结果 declare @table table(name varchar(100),amount int, memo var ...

  9. 数据库开发基础-SQl Server 聚合函数、数学函数、字符串函数、时间日期函数

    SQL 拥有很多可用于计数和计算的内建函数. 函数的语法 内建 SQL 函数的语法是: SELECT function(列) FROM 表 函数的类型 在 SQL 中,基本的函数类型和种类有若干种.函 ...

随机推荐

  1. effective c++ 笔记 (9-12)

    //---------------------------15/03/29---------------------------- //#9    绝不在构造和析构过程中调头virtual函数 { / ...

  2. NodeJS旅程 : module 不可忽略的重点

    modules 模块的简介 Module 是Node.js中最重要的一个部分也是进行深度开发前的必修课.掌握Module才能真正理解NodeJS的精髓,你会发现从思路上会有极大的扩展.  学会写mod ...

  3. 让docker中的mysql启动时自动执行sql文件

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  4. 阿里云ESC入网和出网指的什么

    什么是入网带宽和出网带宽 云服务器 ECS 的入网带宽和出网带宽皆以服务器角度出发.下表给出了入网带宽和出网带宽的具体内容: 带宽类别 (Mbit/s) 描述 入网带宽 流入云服务器 ECS 的带宽从 ...

  5. 关于运行“基于极限学习机ELM的人脸识别程序”代码犯下的一些错误

    代码来源 基于极限学习机ELM的人脸识别程序 感谢文章主的分享 我的环境是 win10 anaconda Command line client (version 1.6.5)(conda 4.3.3 ...

  6. PAT甲题题解-1033. To Fill or Not to Fill (25)-模拟

    模拟先说一下例子,最后为方便起见,在目的地安增加一个费用为0的加油站0 1 2 3 4 5 6 7 87.1 7.0 7.2 6.85 7.5 7.0 7.3 6.0 00 150 200 300 4 ...

  7. C++ 实验 使用重载运算符实现一个复数类

    实验目的: 1.掌握用成员函数重载运算符的方法 2.掌握用友元函数重载运算符的方法 实验要求: 1.定义一个复数类,描述一些必须的成员函数,如:构造函数,析构函数,赋值函数,返回数据成员值的函数等. ...

  8. 《linux内核分析》第一周(2.22~2.28)

    潘恒   原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 计算机是如何工作的? ...

  9. 03-java学习-基本数据类型-运算符-键盘接收用户输入

    java的八大基本数据类型: 类型转换的基本原则: java整数的默认类型是int,小数的默认类型是double 运算符: 算术运算符.连接.赋值.关系.逻辑.三目运算符等…… 键盘接收用户输入: j ...

  10. spring mvc自定义注解--访问时验证

    作用:在访问controller的方法时,判断用户是否是登陆状态. step1:定义注解 import java.lang.annotation.ElementType; import java.la ...