好多次笔试面试的题都考到开窗函数,若对开窗函数不了解,真的吃了好大的亏,今天花点时间整理一下。
此文章整理的知识点部分来自:https://www.cnblogs.com/lihaoyang/p/6756956.html

1.开窗函数简介

与聚合函数一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计。

开窗函数格式: 函数名(列) OVER(选项)

OVER 关键字表示把函数当成开窗函数而不是聚合函数。
SQL 标准允许将所有聚合函数用做开窗函数,使用 OVER 关键字来区分这两种用法。

开窗函数 COUNT() OVER()
对于查询结果的每一行都返回所有符合条件的行的条数。OVER 关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围。如果 OVER 关键字后的括号中的选项为空,则开窗函数会对结果集中的所有行进行聚合运算。

2. 开窗函数的使用实例

数据库表

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(Fname)
from T_Person

查询工资小于5000的每个员工的具体信息

select *
from T_Person
where FSalary < 5000

查询每个人员的信息以及所在城市人数

select  FName, FCity, FAge INT, FSalary,count(*) over(partition by FCity ) as 所在城市人数


查询每一个人员的信息、所在城市人数以及同龄人的人数
(使用多个开窗函数)

select Fname, Fcity, Fsalary, count(*) over (partition by Fcity) as 所在城市人数, count(*) over (partition by Fage) as 同龄人个数
from T_Person


查询从第一行到当前行的工资总和
(RANGE:
ROWS BETWEEN 边界规则1 AND 边界规则2”
用来定位聚合计算范围,这个子句又被称为定位框架)

select fname,fcity,fage,fsalary,sum(fsalary) over(order by fsalary rows between unbounded preceding and current row) 到当前行工资求和from t_person

计算工资排名

select Fname, rank() over(order by(Fsalary) desc) as  工资排名
from t_person
order by 工资排名

查询同龄人中工资最高的员工信息,按工资排序

over(partition by XX  order by XX)  partition by和order by 结合

SQL 开窗函数使用相关推荐

  1. mysql开窗函数_魔幻的SQL开窗函数,为您打开进阶高手的一扇天窗

    经常写SQL脚本的朋友,通常会有一种迷之自信,似乎各种问题都有自己的一套解决方案.时间长了,人的思维可能会逐渐固化.思维固化能提高工作效率,但从某些角度看是很可怕的,我们也同时会失去接受新知识的内在动 ...

  2. SQL开窗函数之前后函数(LEAD、LAG)

    开窗函数 当我们需要进行一些比较复杂的子查询时,聚合函数就会非常的麻烦,因此可以使用开窗函数进行分组再运用函数查询.窗口函数既可以显示聚集前的数据,也可以显示聚集后的数据,可以在同一行中返回基础行的列 ...

  3. Spark SQL 开窗函数row_number的使用

    Spark SQL 开窗函数row_number的使用 窗口函数 row_number即为分组取topN 参考文本:                   型号                      ...

  4. Hive SQL开窗函数详解

    Hive 开窗函数 group by 是分组函数,一组出来一个数据 over() 开窗,针对每一条数据,都有一个独立的组 mk 3 jk 3 mk 3 select orderdate,cost,su ...

  5. SQL开窗函数(窗口函数)详解

    一.什么是开窗函数 开窗函数/分析函数:over() 开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数. 开窗函数的调用格式为: 函数名(列名) OVER(partition by ...

  6. sql开窗函数及编程练习题

    今天做题碰见了个没见过的开窗函数 什么是开窗函数 开窗函数也叫分析函数,有两类:一类是聚合开窗函数,一类是排序开窗函数. 聚合开窗函数就是我们常见的avg().count().sum()等.SQL 标 ...

  7. hive sql—开窗函数—累积求和和滑动求和

    1.数据介绍 数据集有三列数据,姓名.月份和数量: 图1 2.累积求和 使用sum()函数和over()来实现,如下: sum(需要求和的列) over(partition by 分组列 order ...

  8. MYSQL开窗函数详解

    基本概念 MYSQL8.0支持窗口函数(Window Function),也称分析函数.窗口函数与组分聚合函数类似,但是每一行数据都会生成一个结果.如果我们将mysql与pandas中的DataFra ...

  9. Database之SQL:SQL之over partition by开窗函数的简介、使用方法(求各班级内各自排名/求各班级内第一名/求各班级内分数递增和等案例解析)之详细攻略

    Database之SQL:SQL之over partition by开窗函数的简介.使用方法(求各班级内各自排名/求各班级内第一名/求各班级内分数递增和等案例解析)之详细攻略 目录 over part ...

最新文章

  1. 新书介绍 | 图算法指南,A Guide to Graph Algorithms
  2. 使用jsonpath解析json内容
  3. 【深度学习入门到精通系列】神经进化 (NeuroEvolution)
  4. Linux cat指令(用于连接文件并打印到标准输出设备上)
  5. servlet 和 struts2 同时使用 以及 使用struts2标签库时报错
  6. 没有上司的舞会(洛谷-P1352)
  7. Parhaps you are running on a JRE rather than a JDK?
  8. 如何在GitHub上发现优秀的开源项目
  9. 在php中array函数的作用是什么意思,php中的array函数有什么用
  10. 不是shell具有的功能和特点的是_环境监控主机具有哪些功能特点
  11. Android APK 签名问题
  12. 跟我学折纸计算机教案,折纸活动教案
  13. 毕业之后才知道的——知网查重原理以及降重举例
  14. 找回git误删除的文件
  15. heartbeat高可用详解
  16. processing图片粒子化_谈谈文字图片粒子化
  17. js获取注册表中应用程序的路径,并通过注册表打开
  18. 基于卷积和递归神经网络的物联网流量分类器
  19. python之使用cmd命令行写程序
  20. JQuery:$(...).ajaxSubmit is not a function

热门文章

  1. ubuntu和windows双系统默认启动顺序
  2. The requested resource (Servlet action is not available) is not available.这个问题让我通宵了一个晚上
  3. 这个vue3的应用框架你学习了吗?
  4. 宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清
  5. Hack The Box——Ready
  6. 展望计算机未来发展趋势,计算机的未来展望
  7. Typora中(Markdown语法)在符号的上方添加符号或文字
  8. 运维工程师分享7道经典面试题,看完轻松拿Offer
  9. 纪念我的纪念--转正申请
  10. java 获取当前时间所在自然周起止时间及自然周中的每一天