-- 初始化
CREATE TABLE T_Person
(FName VARCHAR2(20), FCity VARCHAR2(20), FAge INT, FSalary INT);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Tom','BeiJing',20,3000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Tim','ChengDu',21,4000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Jim','BeiJing',22,3500);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Lily','London',21,2000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('John','NewYork',22,1000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('YaoMing','BeiJing',20,3000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Swing','London',22,2000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Guo','NewYork',20,2800);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('YuQian','BeiJing',24,8000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Ketty','London',25,8500);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Kitty','ChengDu',25,3000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Merry','BeiJing',23,3500);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Smith','ChengDu',30,3000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Bill','BeiJing',25,2000);
INSERT INTO T_Person(FName, FCity, FAge, FSalary) VALUES('Jerry','NewYork',24,3300); 开窗函数与聚合函数一样,也是对行集组进行聚合计算,但是不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行
计算的行集组是窗口
SELECT COUNT(*) FROM T_Person;
-- 查询每个工资小于5000元的员工信息,并且在每行中都显示所有工资小于5000元的员工个数,报错:列名无效,不包含在聚合函数或者GROUP BY子句中
SELECT FCity, FAge, COUNT(*) FROM T_Person WHERE FSalary <5000;
-- 修改后得到的COUNT(*)不是我想要的
SELECT FCity, FAge,COUNT(*) FROM T_Person WHERE FSalary <5000 GROUP BY FCity,FAge;
-- 通过子查询来解决这个问题
SELECT FCity, FAge, (SELECT COUNT(*) FROM T_Person WHERE FSalary < 5000) FROM T_Person WHERE FSalary <5000;
-- 使用开窗函数
SELECT FCity, FAge, COUNT(*) OVER() FROM T_Person WHERE FSalary <5000;
与聚合函数不同的是,开窗函数在聚合函数后增加了一个OVER关键字。开窗函数的调用格式为:函数名(列) OVER(选项),over关键字把函数当成开窗函数而不是
聚合函数,SQL标准允许将所有聚合函数用做开窗函数,使用OVER关键字来区分这两种用法。OVER()对于查询结果的每一行都返回所有符合条件的行的条数,OVER
关键字后的括号中还经常添加选项,用以改变对聚合运算的窗口范围 开窗函数的OVER关键字后的括号中,可以使用PARTITION BY子句来定义行的分区,从而进行聚合计算。与GROUP BY不同,PARTITION BY子句创建的分区是独立于结
果集的,创建的分区只是供进行聚合运算的,而且不同的开窗函数所创建的分区也互不影响 -- COUNT(*) OVER (PARTITION BY FCity) 表示对结果集按照FCity进行分区,并且计算当期行所属的组的聚合计算结果,多个开窗函数不会互相干扰
SELECT FName, FCity, FAge, FSalary, COUNT(*) OVER (PARTITION BY FCity) FROM T_Person;
SELECT FName, FCity, FAge, FSalary, COUNT(*) OVER (PARTITION BY FCity), COUNT(*) OVER(PARTITION BY FAge) FROM T_Person; 开窗函数可以在OVER关键字后的选项中使用ORDER BY子句来指定排序规则,而且有的开窗函数还要求必须指定排序规则。使用 ORDER BY 子句可以对结果集按照
指定的排序规则进行排序,并且在一个指定的范围内进行聚合运算。 ORDER BY 子句的语法为: ORDER BY 字段名 RANGE|ROWS BETWEEN 边界规则1 AND 边界规
则2
RANGE 按照值得范围进行范围的定义,而ROWS表示按照行的范围进行范围的定义,边界规则得取值表:
CURRENT ROW : 当前行
N PRECEDING :前N行
UNBOUNDED PRECEDING : 一直到第一条记录
N FOLLOWING :后N行
UNBOUNDED FOLLOWING : 一直到最后一条记录
RANGE|ROWS BETWEEN 边界规则1 AND 边界规则2 用来定位聚合计算范围 -- 表示按照FSalary进行排序,然后计算从第一行到当前行的和,这样的额计算结果就是按照工资进行排序的工资值得累积和
SELECT FName, FSalary, SUM(FSalary) OVER(ORDER BY FSalary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM T_Person
-- 表示按照FSalary进行排序,然后计算从第一行到当前行工资范围内的和
SELECT FName, FSalary, SUM(FSalary) OVER(ORDER BY FSalary RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM T_Person
-- 表示按照FSalary进行排序,然后计算从当前行前两行到当前行后2行的工资和
SELECT FName, FSalary, SUM(FSalary) OVER(ORDER BY FSalary ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) FROM T_Person
-- 表示按照FSalary进行排序,然后计算从当前行后1行到当前行后3行的工资和
SELECT FName, FSalary, SUM(FSalary) OVER(ORDER BY FSalary ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING) FROM T_Person
-- 使用行号为范围,第一行到当前行是默认的定位框架,可以省略
SELECT FName, FSalary, FAge, MAX(FSalary) OVER(PARTITION BY FAge ORDER BY FSalary ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM T_Pers
on
SELECT FName, FSalary, FAge, MAX(FSalary) OVER(PARTITION BY FAge ORDER BY FSalary) FROM T_Person 除了在聚合函数使用开窗函数之外,一些高级函数也可以。如:RANK()、 DENSE_RANK()、 ROW_NUMBER()等

  

开窗函数 函数() OVER()的更多相关文章

  1. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

  2. Swift 学习一函数&函数属性&懒加载

    函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 {    代码块    return 返回值} func 函数名(参数列表){  // 返回值为Void 可 ...

  3. 我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中:

    我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中: C/C++ code   ? 1 int retrieve(int scanno,void* buf); 在 ...

  4. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  5. python基础 (初识函数&函数进阶)

    函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  6. 函数函数sigaction、signal

    函数函数sigaction 1. 函数sigaction原型: int sigaction(int signum, const struct sigaction *act, struct sigact ...

  7. python基础之 初识函数&函数进阶

    函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  8. day20 Python 高阶函数,函数,嵌套,闭包 装饰器

    高阶函数定义 1.函数接收的参数是一个函数名 2.函数的返回值是一个函数名 3.满足上述条件任意一个都可以称之为高阶函数 一.函数的接收参数是一个函数名 import time def foo(): ...

  9. JavaScript 引入方式 语言规范 语言基础 数据类型 常用方法 数组 if_else 比较运算符 for while 函数 函数的全局变量和局部变量 {Javascript学习}

    Javascript学习 JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript ...

  10. python -- 初始函数 函数的定义,函数的返回值以及函数的参数

    1.什么是函数,函数的定义及语法 2.函数的返回值 3.函数的参数 一.函数的定义及语法 函数的定义:定义了一个动作或者功能,是对功能的封装 语法: def 函数名( 形参列表 ):          ...

随机推荐

  1. 2019/01/17 对django项目部署的学习

    前记:最近在学习django项目的部署. 开发环境:windows10,使用pycharm,python2.7.15,django1.11.本地测试使用nginx和前端交互. 生产环境:centos7 ...

  2. 【洛谷p1015】【一本通p1309】回文数(noip1999)

    (过了这个题灰常灰常开心) 好像前两道忘记了传送门: 回文数[传送门] 洛谷算法标签: 其实还有高精度 这个题困死在了十六进制,后来想了想,我们在c[i]中存入一个大于十的数之前的程序也可以实现回文( ...

  3. 『MXNet』第二弹_Gluon构建模型

    上节用了Sequential类来构造模型.这里我们另外一种基于Block类的模型构造方法,它让构造模型更加灵活,也将让你能更好的理解Sequential的运行机制. 回顾: 序列模型生成 层填充 初始 ...

  4. bzoj4516: [Sdoi2016]生成魔咒 sam

    题意:每次插入一个数字,查询本质不同的子串有多少个 题解:sam,数字很大,ch数组用map来存,每次ins之后查询一下新建点表示多少个本质不同的子串(l[np]-l[fa[np]]) /****** ...

  5. MySQL主从同步最佳实践

    #!/bin/bash export master_ip=192.168.7.206 export slave_ip=192.168.7.207 export root_passwd=123456   ...

  6. Oracle12c中配置实例参数和修改容器数据库(CDB)及可插拔数据库(PDB)

    Oracle12c中的多宿主选项允许一个容器数据库(CDB)容纳多个独立的可插拔数据库(PDB).本文将展示如何配置实例参数和修改容器数据库(CDB)及可插拔数据库(PDB).1. 配置CDB中的实例 ...

  7. Python内置模块之time、random、hashlib、OS、sys、UUID模块

    Python常用模块 1.time模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(struct_time).格式化的时间字符串: (1)时间戳(timestamp) :通常来说,时间 ...

  8. EvalAI使用——类似kaggle的开源平台,不过没有kernel fork功能,比较蛋疼

    官方的代码 https://github.com/Cloud-CV/EvalAI 我一直没法成功import yaml配置举办比赛(create a challenge on EvalAI 使用htt ...

  9. python QMainWindow QWidget

    from PyQt5 import QtWidgetsfrom untitled import Ui_MainWindowfrom PyQt5.QtWidgets import QFileDialog ...

  10. Java Date实现加一天,年月日类推往后+1,日期+1,月份+1,年份+1

    System.out.println("String类型 "+endDate); //页面传递到后台的时间 为String类型 SimpleDateFormat sdf = new ...