【窗口函数的详细使用】

news2024/11/26 7:39:46

前言:
💞💞大家好,我是书生♡,今天主要和大家分享一下可MySQL中的窗口函数的概念,语法以及常用的窗口函数,希望对大家有所帮助。感谢大家关注点赞。
💞💞前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员

个人主页⭐: 书生♡
gitee主页🙋‍♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬

在这里插入图片描述

目录

  • 1.窗口函数的定义
  • 2. 窗口函数的作用
  • 3. 窗口函数的语法
  • 4. 窗口函数的分类
  • 5. 窗口函数
    • 5.1 聚合窗口函数
      • 5.1.1 分组聚合函数
      • 5.1.2 分组排序聚合函数
    • 5.2 取值窗口
      • 5.2.1 向上取值
      • 5.2.2 向下取值
      • 5.2.3 分组取值
      • 5.2.4 取第一个值
    • 5.3 排序窗口
    • 5.4 窗口计算范围的指定
    • 5.5 order by 计算范围
  • 6. CTE语法
    • 6.1 CTE的基本语法

1.窗口函数的定义

  定义:窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据进行实时分析处理。
    窗口函数可以对查询结果集中的行进行分组、排序,并在每个分组内进行聚合、排名、计算等操作,而不会改变原始查询结果的行数或顺序。

2. 窗口函数的作用

  窗口函数(Window Functions)在数据库查询中扮演着非常重要的角色,它们允许用户对查询结果集中的数据进行分组、排序,并在每个分组内进行聚合、排名、计算等操作,而不改变原始查询结果的行数或顺序。以下是窗口函数的一些主要作用:

  • 分组内聚合:窗口函数可以在每个分区(由PARTITION BY子句定义)内执行聚合操作,如计算每个部门的平均工资、每个班级的最高分等。与传统的聚合函数不同,窗口函数会为每一行返回一个结果,而不是将整个分组压缩成一个结果。
  • 排名和排序:窗口函数如ROW_NUMBER(), RANK(), DENSE_RANK()等可以用来为结果集中的每一行分配一个唯一的序号或排名。这些排名可以是基于某个字段的值,或者是在某个分区内的相对位置。
    滑动窗口计算:通过定义窗口的起始和结束范围(使用OVER子句中的ROWS BETWEEN子句),窗口函数可以执行滑动窗口计算,如计算连续几天的平均销售额、计算过去三个月的累计销售额等。
  • 访问其他行:LAG()和LEAD()等窗口函数允许用户访问结果集中的前一行或后一行的数据。这对于计算与前一行或后一行的差异、比较或构建时间序列分析等非常有用。
  • 获取边界值:FIRST_VALUE()和LAST_VALUE()等窗口函数可以返回每个分区中的第一行或最后一行的某个字段的值。
  • 数据桶划分:NTILE()函数可以将结果集中的数据划分为指定数量的近似大小的数据桶,并为每行分配一个桶号。

3. 窗口函数的语法

窗口函数([参数]) OVER (
  [PARTITION BY <分组列>] 
  [ORDER BY <排序列 ASC/DESC>]
  [ROWS BETWEEN 开始行 AND 结束行]
)
  • PARTITION BY 子句用于指定分组列,关键字:PARTITION BY 。
  • ORDER BY 子句用于指定排序列,关键字ORDER BY 。
  • ROWS BETWEEN 子句用于指定窗口的范围,关键字ROWS BETWEEN 即[开始行]、[结束行]

窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中
执行顺序: from>where>group by >聚合函数>having >select >distinct >order by >limit

4. 窗口函数的分类

  • 排序函数:row_number(),rank(),dense_rank()
  • 聚合函数:max(),min(),count(),sum(),avg(),median()
  • 向前向后取值:lag(),lead()
  • 百分位:percent_rank()
  • 取值函数:first_value(),last_value(),nth_value()
  • 分箱函数:ntile()

这里我们重点简述排序函数、聚合函数、取值函数、向前向后取值。

5. 窗口函数

5.1 聚合窗口函数

  • 聚合窗口函数结合了聚合函数和窗口函数的特性,用于在数据的特定窗口或分区上执行聚合计算。
  • 它允许在保持数据完整性的同时,对数据的子集(即窗口)进行复杂的统计和分析。

5.1.1 分组聚合函数

格式为:
聚合函数 over(partition by 分组字段)

-- 按照性别分组统计年龄和
SELECT sid,
       sname,
       age,
       gander,
       province,
       tuition,
       sum(age) OVER (PARTITION BY gander)
FROM stu;

在这里插入图片描述

-- 按照省份、性别分组统计年龄和
SELECT sid,
       sname,
       age,
       gander,
       province,
       tuition,
       sum(age) OVER (PARTITION BY province,gander)
FROM stu;

在这里插入图片描述

5.1.2 分组排序聚合函数

SELECT sid,
       sname,
       age,
       gander,
       province,
       tuition,
       sum(tuition) OVER (PARTITION BY gander ORDER BY age)
FROM stu;

在这里插入图片描述

SELECT sid,
       sname,
       age,
       gander,
       province,
       tuition,
       avg(tuition) OVER (PARTITION BY gander ORDER BY age)
FROM stu;

在这里插入图片描述

5.2 取值窗口

取值窗口函数是用于在数据库查询中返回指定位置上的数据的函数。这类函数允许在结果集的每一行上执行计算,同时保留原始数据行的上下文信息。

FIRST_VALUE:返回窗口内第一行的数据。
LAST_VALUE:返回窗口内最后一行的数据。
NTH_VALUE:返回窗口内第N行的数据。
LAG:返回分区中当前行之前的第N行的数据。需要注意的是,LAG函数不支持动态的窗口大小,而是以当前分区作为分析的窗口。
LEAD:返回分区中当前行之后第N行的数据。同样,LEAD函数也不支持动态的窗口大小。

向上向下取值,取第一个值
lag lead,first_value

5.2.1 向上取值

-- 向上一行取值
select empno,ename,lag(ename) over() from emp;
-- 将名字字段取上一行的值,没有上一行默认为null

在这里插入图片描述

-- 向上取二行
SELECT empno, ename, lag(ename, 2) OVER ()
FROM emp;

在这里插入图片描述

-- 取不到值给默认值
SELECT empno, ename, lag(ename, 2, 'itcast') OVER ()
FROM emp;

在这里插入图片描述

5.2.2 向下取值

-- 向下取一行
SELECT empno, ename, lead(ename) OVER ()
FROM emp;

在这里插入图片描述

-- 向下取二行
SELECT empno, ename, lead(ename, 2) OVER ()
FROM emp;

在这里插入图片描述

-- 取不到值给默认值
SELECT empno, ename, lead(ename, 2, 'itcast') OVER ()
FROM emp;

在这里插入图片描述

5.2.3 分组取值

分组取值–分组只进行组内查找

-- 分组取值--分组只进行组内查找
SELECT *, lag(ename) OVER (PARTITION BY job)
FROM emp;

在这里插入图片描述

5.2.4 取第一个值

只取组内第一个值

-- 取第一个值
SELECT *, first_value(ename) OVER (PARTITION BY job)
FROM emp;

在这里插入图片描述

5.3 排序窗口

  • 按照指定字段排序后生成序号
  • 排序窗口函数允许用户根据指定的排序规则对窗口内的数据进行排序,以便更好地理解和分析数据。这些函数在数据处理和分析中非常有用,特别是在需要获取前几名、排名等场景时。
RANK():
    功能:对窗口内的数据进行排名。
    特点:如果存在并列情况,会占用下一个名次的位置。例如,如果有三个学生并列第一名,那么下一个学生的排名将是第四名。
    语法示例:RANK() OVER (PARTITION BY 班级 ORDER BY 成绩 DESC) AS ranking
DENSE_RANK():
    功能:与RANK()类似,但处理并列情况的方式不同。
    特点:即使存在并列情况,也不会跳过下一个名次。例如,如果有三个学生并列第一名,那么下一个学生的排名将是第二名。
    语法示例:DENSE_RANK() OVER (PARTITION BY 班级 ORDER BY 成绩 DESC) AS ranking
ROW_NUMBER():
    功能:为窗口内的每一行分配一个唯一的序号。
    特点:不考虑并列情况,即使两行数据完全相同,也会分配不同的序号。
    语法示例:ROW_NUMBER() OVER (PARTITION BY 班级 ORDER BY 成绩 DESC) AS ranking

案例:

-- 排序
select *,
       rank() over (order by sal)  as rnk, -- 如果有并列生成序号是不连续的
       dense_rank()  over (order by sal)  as dernk, -- 生成连续序号
       row_number() over (order by sal) as rw -- 生成行号
from emp;

在这里插入图片描述

select * from (
select *,
       dense_rank()  over (order by sal desc )  as dernk -- 生成连续序号
from emp) tb1
where dernk <=3;

在这里插入图片描述

5.4 窗口计算范围的指定

需要使用rows 进行指定 计算行数
范围的确认:
默认情况下没有指定partition by 的字段,范围是全表,如果指定了partition by ,范围是分组内的范围

可以通过rows指定计算行的范围大小,指定计算行范围后,只对范围内的数据进行计算
row between 起始行 and 结束行

指定范围关键字
    向上无限制:  unbounded preceding 向上的行数没有限制
    向上指定行数: 行数 preceding
    当前行:      current row
    向下指定行数: 行数 following
    向下无限制:  unbounded following

不同关键字可以组合成一个范围
between 起始行范围 and 结束行范围

between 2 preceding  and  1 following  范围查找是以当前行为基准  计算四行(上两行+当前行+下一行)

between current row  and  2 following     计算3行(当前行+下两行)

范围顺序要注意,一般起始行写向上查找,结束行写向下查找,可以同上或者同下,但是范围不能超过

-- 范围是向上无限制-向下无限制,以当前行为基准,就是行号
SELECT *, count(ename) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS count
FROM emp;

在这里插入图片描述

select *,count(ename) over(rows between 2 preceding and 2 following ) cnt from emp;

在这里插入图片描述

select *,sum(sal) over(rows between 2 following and 3 following ) cnt from emp;

在这里插入图片描述

5.5 order by 计算范围

使用了order by 后会自带计算范围统计数据

在这里插入图片描述
在这里插入图片描述

6. CTE语法

CTE语法是一种常见的SQL语法,全称为“公共表表达式”(Common Table Expressions,CTE)。

CTE语法类似子查询,可以将一个select语句计算的结果当成一个新的临时表使用,CTE语法允许你在一个SQL语句中创建一个命名的临时结果集,这个临时结果集只在当前的SQL语句执行期间存在。CTE可以提高SQL语句的可读性和维护性,同时也可能提高查询效率。

6.1 CTE的基本语法

-- 基本用法
with 临时表名 as(查询语句)
select * from 临时表名

-- 多个计算结果保存
with tb1 as(查询语句),,
	tb2 as(查询语句 select * from tb1),
	tb3 as(查询语句)
	.....
select * from tb3 join tb2

案例:

with tb1 as(select * from emp)
select ename,sal from tb1;

在这里插入图片描述

with tb1 as(
    SELECT user_id, shop, count(*) AS cnt
            FROM test2
            GROUP BY user_id, shop
),
    tb2 as(
        SELECT tb1.*,
             row_number() over (partition BY tb1.shop ORDER BY tb1.cnt DESC) rk
      FROM tb1
    )
select * from tb2 where rk <=3;

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

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

相关文章

(面试官问我微服务与naocs的使用我回答了如下,面试官让我回去等通知)微服务拆分与nacos的配置使用

微服务架构 正常的小项目就是所有的功能集成在一个模块中&#xff0c;这样代码之间不仅非常耦合&#xff0c;而且修改处理的时候也非常的麻烦&#xff0c;应对高并发时也不好处理&#xff0c;所以 我们可以使用微服务架构&#xff0c;对项目进行模块之间的拆分&#xff0c;每一…

Nacos服务管理

1.前言 在当前的分布式系统和微服务架构中&#xff0c;服务发现和管理变得至关重要。Nacos&#xff08;NAme COntrol Service&#xff09;作为一个开源的动态服务发现、配置管理和服务管理平台&#xff0c;为解决这些挑战提供了一站式的解决方案。其提供的负载均衡、分环境管理…

接口自动化框架封装思想建立(全)

httprunner框架&#xff08;上&#xff09; 一、什么是Httprunner&#xff1f; 1.httprunner是一个面向http协议的通用测试框架&#xff0c;以前比较流行的是2.X版本。 2.他的思想是只需要维护yaml/json文件就可以实现接口自动化测试&#xff0c;性能测试&#xff0c;线上监…

elementplu父级页面怎么使用封装子组件原组件的方法

一、使用原因&#xff1a; 封装了el-table&#xff0c;表格中有多选&#xff0c;父级要根据指定状态&#xff0c;让其选择不上&#xff0c;需要用到elementplus中table原方法toggleRowSelection 附加小知识点&#xff1a;&#xff08;el-tree刷新树后之前选中的保持高亮setCurr…

【荒原之梦考研数学】感谢 CSDN 的小伙伴们

自 2016 年在 CSDN 上开设账号至今&#xff0c;荒原之梦网获得了很多同学们的支持和肯定&#xff0c;以及意见或建议&#xff0c;荒原之梦网一路走来&#xff0c;是大家给予了我们不断前进的动力。 当前这个 CSDN 账号&#xff0c;是荒原之梦考研数学网目前在 CSDN 的第一个也…

css 中clip 属性和替代方案 clip-path属性使用

clip clip 属性概述 作用&#xff1a;clip 属性用于定义一个裁剪区域&#xff0c;该区域外的元素内容将不可见。适用元素&#xff1a;clip 属性只对绝对定位&#xff08;position: absolute&#xff09;或固定定位&#xff08;position: fixed&#xff09;的元素有效&#xf…

JVM学习-Arthas

Arthas Alibaba开源的Java诊断工具&#xff0c;在线排查问题&#xff0c;无需重启&#xff0c;动态跟踪Java代码&#xff0c;实时监控JVM状态Arthas支持JDK6&#xff0c;支持Linux/Mac/Windows&#xff0c;采用命令行交互模式&#xff0c;同时提供丰富的Tab自动补全功能&#…

MogoTemplate基本入门(Mongodb数据库基本增删改查)

nosql 因为没有标准的 sql&#xff0c;各有各的操作方式&#xff0c;所以学习成本比较高。实际应用也不会去命令行直接操作&#xff0c;而是用编程语言的 api。 所以我们可以简单了解一下Mongodb&#xff0c;然后用java的Api去操作就行了 没必要花很大功夫在命令行上操作执行…

创意SQL,高考祝福!一起为学子们加油助威!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

rman恢复后,少部分数据文件状态为MISSING000**

客户有套一体机&#xff0c;每天晚上21点开始做rman完全备份&#xff0c;大约第2天上午9点多完成备份&#xff0c;rman备份保留策略保留一份完全备份 6月1日晚21点自动发起备份&#xff0c;6月2日上午10点15分完成备份&#xff0c;并生成了一个控制文件备份 c-4063271871-2024…

Navicat修改数据库主键

在MySQL数据库&#xff0c;主键ID默认自增&#xff08;最大的数字自增&#xff09;&#xff0c;但是&#xff0c;在某些情况下&#xff0c;我们想将其从头开始………… 借助Navicat修改数据库主键即可&#xff01; 1. 找到数据库&#xff0c;点击需要更改的表&#xff1a;点击…

二重,三重积分和曲面,曲线积分的关系和区别

这是我在学习完曲面曲线积分概念后容易和二重三重积分混淆而大概总结和区分了一下&#xff0c;如果有错误请大佬指出&#xff0c;多谢&#xff01;&#xff01;&#xff01;

I2C通信外设

I2C外设介绍 主机&#xff0c;就是拥有主动控制总线的权利。从机&#xff0c;只能在从机允许的情况下&#xff0c;才能控制总线。 多主机模型可分为固定多主机和可变多主机。固定多主机就是总线上&#xff0c;有2个或2个以上固定的主机&#xff0c;上面固定为主机&#xff0c;下…

GIF录屏工具Gif123 v3.3.0单文件

软件介绍 GIF的优势是小、轻、快&#xff0c;适合时间短、画面小、需要嵌入其他页面&#xff0c;打开就自动循环播放的动画。Gif123可录制合成鼠标轨迹,可调整鼠标指针大小,可在设置中打开鼠标指针高亮光圈功能,高亮光圈可跟随鼠标移动以指示鼠标位置。软件极其简单&#xff0…

使用 IPSET 添加 CDN 节点 IP(IPv4/IPv6)到防火墙白名单

明月的服务器一直使用的是 iptables,随着近几年 IPv6 的普及&#xff0c;明月切身体会到还是 IPSET 最方便了&#xff0c;无论你是 IPv4 还是 IPv6 都可以方便的管理&#xff0c;无论你是加入白名单还是黑名单&#xff0c;都非常的简单高效&#xff01;今天就参照明月自己的实操…

高校运维赛 2024 pyssrf

没有环境,简单过一遍思路吧 考点: pickle反序列化urllib库注入redis缓存 from flask import Flask,request from redis import Redis import hashlib import pickle import base64 import urllib app Flask(__name__) redis Redis(host127.0.0.1, port6379)def get_result(u…

安全测试 之 安全漏洞 CSRF

1. 背景 安全测试是在功能测试的基础上进行的&#xff0c;它验证软件的安全需求&#xff0c;确保产品在遭受恶意攻击时仍能正常运行&#xff0c;并保护用户信息不受侵犯。 2. CSRF 定义 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;中文名为“跨站请…

halo进阶-主题插件使用

开始捣鼓捣鼓halo&#xff0c;换换主题&#xff0c;加个页面 可参考&#xff1a;Halo 文档 安装/更新主题 主题如同壁纸&#xff0c;萝卜青菜各有所爱&#xff0c;大家按需更换即可&#xff1b; Halo好在一键更换主题&#xff0c;炒鸡方便。 安装/更新插件 此插件还扩展了插件…

神经网络 torch.nn---损失函数与反向传播

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.nn — PyTorch 2.3 documentation Loss Function的作用 每次训练神经网络的时候都会有一个目标&#xff0c;也会有一个输出。目标和输出之间的误差&#xff0c;就是用Loss Function来衡量的。所以&#xff0c;…

超简单白话文机器学习 - 模型检验与评估(含算法介绍,公式,源代码实现以及调包实现)

1. 模型检验 1.1 Holdout交叉验证 1.1.1 算法 在这种交叉验证技术中&#xff0c;整个数据集被随机划分为训练集和验证集。根据经验&#xff0c;整个数据集的近 70% 用作训练集&#xff0c;其余 30% 用作验证集。 优点&#xff1a;可以快速进行区分&#xff0c;仅仅通过一次区…