SQL开窗函数之基本用法和聚合函数

news2024/9/25 1:19:07

开窗函数

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

常见运用场景: 对班里同学成绩进行排序
常见的窗口函数
在这里插入图片描述

开窗函数基本形式

func_name(<parameter>) 
OVER(
[PARTITION BY <part_by_condition>] 
[ORDER BY <order_by_list> ASC|DESC]
[rows between ?? And ??]
)

字段解释

  • func_name:需要进行计算的函数,在这里可以填入所需要的各种函数
  • over():对数据进行操作
    • partition by:根据某字段对数据进行分组
    • order by:每个窗口的数据根据某字段进行升序或降序排列
      • e.g. over(partition by xxx order by yyy): 按xxx进行分组,按列yyy进行排序
    • rows between ... and ...:细分窗口,选择当前分区的一个子集,通常当做滑动窗口使用
      • current row:当前行
      • unbounded preceding:分区中的第一行
      • unbounded following:分区中的最后一行
      • expr preceding:(当前行 - expr的值)的行
      • expr following:(当前行 + expr的值)的行

注:
排序子句后面缺少窗口子句,窗口规范默认是 rows between unbounded preceding and current row
排序子句和窗口子句都缺失,窗口规范默认是 rows between unbounded preceding and unbounded following


Partition by

Sales表
在这里插入图片描述

select *,
max(sales) over(partition by idate) as '每个月一个员工最大的销量',
max(sales) over(partition by iname) as '每个员工在这几个月里最大的销量'
from Sales;

在这里插入图片描述

Order by

Sales表
在这里插入图片描述

select *,
row_number() over(order by sales desc) as '按销量进行排序',
row_number() over(partition by idate order by sales desc) as '每个月按销量进行排序'
from Sales;

在这里插入图片描述

Rows between and

weather表
在这里插入图片描述

select *, 
avg(temperature) over(order by recordDate rows between current row and 1 following) as '今天和明天天气的均值',
avg(temperature) over(order by recordDate rows between 1 preceding and current row) as '昨天和今天天气的均值',
avg(temperature) over(order by recordDate rows between 2 preceding and 1 preceding) as '前天和昨天天气的均值',
avg(temperature) over(order by recordDate rows between current row and unbounded following) as '今天到表里未来天气的均值',
avg(temperature) over(order by recordDate rows between unbounded preceding and current row) as '第一条记录到今天的天气均值'
from weather;

在这里插入图片描述

聚合函数

Sales表
在这里插入图片描述

-- 这里举例了几个常见的聚合函数
select *, 
max(sales) over(partition by month(idate)) as max,
min(sales) over(partition by month(idate)) as min, 
avg(sales) over(partition by month(idate)) as avg,
sum(sales) over(partition by month(idate)) as sum 
from Sales;

在这里插入图片描述



这里主要用到的两个例子建表如下

-- Sales表
CREATE TABLE Sales
( 
idate date, 
iname char(2), 
sales int
); 
-- 向表中插入数据 
INSERT INTO Sales VALUES 
('2021/1/1', '丁一', 200), 
('2021/2/1', '丁一', 180), 
('2021/2/1', '李四', 100), 
('2021/3/1', '李四', 150), 
('2021/2/1', '刘猛', 180), 
('2021/3/1', '刘猛', 150), 
('2021/1/1', '王二', 200), 
('2021/2/1', '王二', 180), 
('2021/3/1', '王二', 300), 
('2021/1/1', '张三', 300), 
('2021/2/1', '张三', 280), 
('2021/3/1', '张三', 280); 

-- weather表
drop table if exists weather;
create table weather(
    id int,
    recordDate date,
    temperature int
);
insert into weather
values (1,'2015-01-01',10),
       (2,'2015-01-02',25),
       (3,'2015-01-03',20),
       (4,'2015-01-04',30);

参考来源
MySQL开窗函数
MySQL模块:开窗函数
MySQL基础(六)——MySQL之开窗函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python之模块使用

目录 一、模块 二、标准模块 collections模块 三、异常处理 四、文件操作 一、模块 Python 模块(Module)&#xff0c;是一个 Python 文件&#xff0c;以 .py 结尾&#xff0c;包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 新建util…

day17【代码随想录】找出字符串中第一个匹配项的下标 、重复的子字符串

文章目录前言一、找出字符串中第一个匹配项的下标&#xff08;力扣28&#xff09;二、重复的子字符串&#xff08;力扣459&#xff09;前言 1、找出字符串中第一个匹配项的下标 2、重复的子字符串 一、找出字符串中第一个匹配项的下标&#xff08;力扣28&#xff09; 给你两个…

LeetCode HOT 100 —— 200 .岛屿问题

题目 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该…

有意思,圣诞节自己做一个装饰圣诞帽头像的APP!

话说又到了一年一度到别人到节日&#xff0c;圣诞节&#xff0c;还记得去年的时候&#xff0c;朋友圈疯狂转发到圣诞帽嘛&#xff0c;在圣诞节为自己到头像增加一款圣诞帽还是蛮应景的。 我们的目标就是是这样的 ❝ 当然&#xff0c;如果你对过程不感兴趣&#xff0c;那么直接到…

总结本人学习b站黑马前端课程,各部分案例汇总

目录 1.Ajax&#xff1a; 对应课程&#xff1a; b站黑马JavaScript的Ajax案例代码——新闻列表案例 b站黑马JavaScript的Ajax案例代码——评论列表案例 b站黑马JavaScript的Ajax案例代码——聊天机器人案例 b站黑马JavaScript的Ajax案例代码——图书管理案例 2.ES6面向对…

HTML-如何让网站变成灰色?

在某些特定的时候&#xff0c;我们经常会看到网站会将整体布局设置成灰色色调&#xff0c;以示哀悼。 那么这是怎么实现的呢&#xff1f; 我去查了下相关的文章&#xff0c;发现是通过CSS的 过滤器函数 实现的&#xff0c;详见&#xff1a;grayscale()。 grayscale:对图片进…

MySql性能优化(三)执行计划详解

执行计划 执行计划执行计划概述idselect_typetabletypepossible_keyskeykey_lenrefrowsextra官网地址 在具体的应用当中&#xff0c;我们排查sql有没有走索引&#xff0c;性能如何&#xff0c;需要查看Sql语句具体的执行过程&#xff0c;以方便我们调整sql来加快sql的执行效率。…

如何通过 IntelliJ IDEA 来提升 Java8 Stream 的编码效率

小新再次推荐一篇 &#xff0c;主要是讲如何通过 IntelliJ IDEA 来提升 Stream 的编码效率&#xff0c;算是一个小技巧&#xff0c;经常使用 Java8 Stream 流的小伙伴们&#xff0c;可以试下&#xff0c;能够提升工作效率哦&#xff01; 一、Java8 Stream API 的不友好性 Java…

02优先队列和索引优先队列-优先队列-数据结构和算法(Java)

文章目录1 概述1.1 需求1.2 优先队列特点1.3 优先队列分类1.4 应用场景1.5 相关延伸2 说明3 索引优先队列3.1 实现思路3.2 API设计3.2 代码实现及简单测试5 主要方法讲解5.1 exch()5.2 insert()5.2 poll()6 分析7 后记1 概述 普通的队列是一种先进先出的数据结构&#xff0c;元…

JMeter连接Oracle过程及常见问题总结

如果被测试系统使用的数据库不是MySQL而是Oracle&#xff0c;如何用JMeter进行连接呢&#xff1f; 一、下载数据库驱动 需要确认数据库的版本&#xff0c;可以上网站下载驱动&#xff1a;https://www.oracle.com/database/technologies/jdbc-ucp-122-downloads.html。 或者直…

【Linux】进程间通信-共享内存

前言 我们知道&#xff0c;在Linux中&#xff0c;进程是相互独立存在的&#xff0c;不存在直接让进程之间互相通信的方式。但是如果我们能让不同进程之间见到同一块内存&#xff0c;也就是都能读写这片区域是不是就能够达到进程间通信呢&#xff1f; 事实证明确实如此。在之前我…

【springboot进阶】基于starter项目构建(二)构建starter项目-fastjson

目录 一、创建 fastjson-spring-boot-starter 项目 二、添加 pom 文件依赖 三、构建配置 四、加载自动化配置 五、打包 六、使用 这个系列讲解项目的构建方式&#xff0c;主要使用 父项目 parent 和 自定义 starter 结合。项目使用最新的 springboot3 和 jdk19。本系列的…

kinect v2安装iai_kinect2

目前已完成 前期已经安装了libfreenect2 使用的系统为ubuntu 18.04 使用的相机为kinect v2 已经安装好了orb_slam3&#xff0c;已经完成使用stereo在euroc数据集和使用RGB-D在tum数据集上的测试 目的 想要完成使用深度相机进行在线测试 步骤 step1 经过查阅资料发现目前仅…

大学生HTML期末作业, JavaScript期末大作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java项目:SSM设备台账管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,物理设备管理,IP地址资源管理,虚拟机管理,通知公告管理,学历管理,部门管理,员工管理等功能。 …

DFS 数据结构 C++语言实现 图的深度优先遍历

1.DFS图解 图的深度优先遍历 1.1 基本定义&#xff1a; 设初始时&#xff0c;图中所有顶点未曾被访问过&#xff1a; ● 从图中某个顶点 v 出发&#xff0c;访问此顶点&#xff1b; ● 依次从 v 的未被访问的邻接点出发深度优先遍历图&#xff0c;直至图中所有和顶点 v 有路…

【非下载vs解决】error: Microsoft Visual C++ 14.0 or greater is required

首先说解决办法 搜索下载对应库的whl文件即可 下面是解决过程 部分报错为&#xff1a;error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools”: https://visualstudio.microsoft.com/visual-cpp-build-tools/ 我是安装wordcloud库…

Activemq安装和控制台

目录 一、安装 二、后台服务启动 三、查看前台 一、安装 http://blog.csdn.net/gebitan505/article/details/55096222 二、后台服务启动 普通启动/关闭 到activemq的目录下执行【./activemq start/stop】进行开启和关闭activemq 带日志的启动 控制台不输出东西&#x…

Stm32旧版库函数2——mpu6050 移植成旧版兼容型库函数DMP

main.c: /******************************************************************************* // 陀螺仪 MPU6050 IIC测试程序 // 使用单片机STM32F103C8T6 // 晶振&#xff1a;8.00M // 编译环境 Keil uVision4 // 在3.3V的供电环境下&#xff0c;就能运行 // 波特率 9600 /…

STM32通过DAC产生正弦波

前言 这一讲主要来讲解DAC功能 文章目录 前言一、DAC简介二、DAC通道框图三、DAC输出电压四、输出正弦波五、代码一、DAC简介 数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位(1…