【SQL应知应会】分析函数的点点滴滴(三)

news2025/1/15 23:04:52

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

分析函数的点点滴滴

  • 1.什么是分析函数:
    • 1.1统计分析函数略解
    • 1.2.排序分析函数
    • 1.3 开窗函数 ROW 与 RANGE
    • 1.4 统计分析函数详解
    • 1.5 不使用order by时
    • 1.6 开窗函数与聚合函数
  • 2. 偏移分析函数 lag()与lead()用法
  • 3. mysql低版本怎么实现分组排序:row_number()为例
    • 3.1 原因:mysql8 版本才支持 over partition by 函数
    • 3.2 解决方法:

本篇文章依然是讲SQL的分析函数的知识点,在前面的两篇文章中已经讲解了分析函数是什么、统计分析函数和排序分析函数也进行了详细的讲解和代码演示、开窗函数,这篇文章,将重心放在开窗函数与聚合函数的联合使用,并讲解了偏移分析函数lag()lead()的用法和代码演示,在文章的末尾,对row_number()进行了扩展,因为MySQL5.7中是没有这个函数的,mysql8 版本才支持 over partition by 函数的,那么对于低版本的MySQL我们应该如何应对呢?那就快一起来学习这篇文章吧。
如果有不去的地方,大家可以评论区或者私信我,十分感谢

1.什么是分析函数:

👉:传送门💖分析函数💖

1.1统计分析函数略解

👉:传送门💖统计分析函数💖

1.2.排序分析函数

👉:传送门💖排序分析函数💖

1.3 开窗函数 ROW 与 RANGE

👉:传送门💖开窗函数 ROW 与 RANGE💖

1.4 统计分析函数详解

👉:传送门💖统计分析函数💖

1.5 不使用order by时

👉:传送门💖不使用order by时💖

1.6 开窗函数与聚合函数

先进行聚合函数,再进行开窗函数

select deptno,
	   sum(count(empno)) over(order by count(empno) 
       rows between unbounded preceding and current row)
from emp t group by deptno;
  • 1.会先进行聚合函数
select deptno,count(empno) from emp group by deptno order by count(empno)

在MySQL和Oracle中,还可以写成

select deptno,count(empno) cnt from emp group by deptno order by cnt
# 因为order by的执行顺序在select后

但是如果是having,则在Oracle中是不可以的

# MySQL:可以
select deptno,count(empno) cnt from emp group by deptno having cnt > 1; -- select先执行,having后执行

# Oracle:不可以
select deptno,count(empno) cnt from emp group by deptno having cnt > 1; -- having先执行,select后执行

# Oracle:可以
select deptno,count(empno) cnt from emp group by deptno having count(empno) > 1; -- oracle的having后面只能跟函数
# ChatGPT:
在 Oracle 中,HAVING 用于对 GROUP BY 结果进行筛选过滤,只有满足筛选条件的组才被返回。
通常情况下,HAVING 后面都是需要对分组后的结果进行聚合统计的函数,例如 SUM()、COUNT()、MAX()、
MIN()、AVG() 等函数,因为这些函数能够对每个分组内的数据进行计算,并返回分组后的统计结果。但是,
HAVING 后面也可以跟普通的表达式和逻辑运算符组成的条件,这时需要将这些条件中所涉及的列都包含在 
GROUP BY 子句中。但是在这种情况下,需要注意你的查询结果是否符合你的预期,因为这种方法可能会
导致某些行被排除在分组结果之外。

请添加图片描述

  • 2.再进行开窗函数
    • 下图中的结果就是在上图中的结果的基础上进行计算,3,3+6=9,9+6=15
# 开窗函数里面的内容,需要在聚合函数得到的结果的基础上进行
# 如聚合函数中只有deptno和count(empno)
select deptno,
	   sum(count(empno)) over(order by count(empno) 
       rows between unbounded preceding and current row)
from emp t group by deptno;

在这里插入图片描述

2. 偏移分析函数 lag()与lead()用法

lag()lead()函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的**前N行的数据(lag)后N行的数据(lead)**作为独立的列,从而更方便地进行进行数据过滤。

over()表示 lag()与lead()操作的数据都在over()的范围内,他里面可以使用partition by 语句(用于分组) order by 语句(用于排序)

lead(field, num, defaultvalue)field需要查找的字段,num往后查找的num行的数据,defaultvalue没有符合条件的默认值

  • lag() 的使用示例
select e.*,lag(sal) over() from emp e;
# 由下图,显然lag(sal)中有缺省值,为lag(sal,1,null)
  • 代码效果及重点标注如下图所示:
    在这里插入图片描述

  • lead() 的使用示例

select e.*,lead(sal,2,null) over() from emp e;
  • 代码效果及重点标注如下图所示:
    在这里插入图片描述
select e.*,lead(sal,1,null) over(partition by deptno) from emp e;
# 加了分区(分组),所以lead会在组内偏移
  • 代码效果及重点标注如下图所示:
    在这里插入图片描述
  • MySQL可以在原始数据上还用lag()lead(),Oracle需要在over()中加入内容,如partition byorder by
Oracle:select e.*,lead(sal,1,null) over(order by empno) from emp e;

在这里插入图片描述

Oracle:select e.*,lead(sal,1,null) over(partition by job order by sal) from emp e;

在这里插入图片描述

3. mysql低版本怎么实现分组排序:row_number()为例

3.1 原因:mysql8 版本才支持 over partition by 函数

3.2 解决方法:

set @rownum = 0;   -- @rownum自增参数,初始化参数为0
set @cid = '';     -- 初始化动态参数cid为空
select 'sid','cid',score
  from(
      select 'sid',  
      		 'cid',
      		  score,
	   		  case when @cid = 'cid' then @rownum := @rownum + 1
	          else @rownum := 1  -- 因为@cid初始化为空,所以第一次循环,@cid ≠ 'cid',所以不执行then,执行else子句
	          end rn,
	          @cid := 'cid', -- 第一轮循环时将cid的值赋给@cid
      from sc
      order by 'cid',score desc -- cid默认升序,score通过desc降序
      ) a
where rn <= 2;
  • 表内容下图左半部分,代码运行解析下图右半部分
    在这里插入图片描述
    请添加图片描述

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

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

相关文章

HDFS写流程源码分析(一)-客户端

HDFS 写流程源码分析 一、客户端&#xff08;一&#xff09;文件创建及Pipeline构建阶段&#xff08;二&#xff09;数据写入&#xff08;三&#xff09;输出流关闭 二、服务端 环境为hadoop 3.1.3 一、客户端 以下代码创建并写入文件。 public void create() throws URISynt…

计网学习记录

ps:答案可能不正确噢。 1.什么是计算机网络体系结构&#xff1f;什么是网络协议&#xff1f;协议的三要素是什么&#xff1f;每个要素的含义是什么&#xff1f; 计算机网络体系结构&#xff1a; 我看书上也没说清啊。。。 &#xff08;概念磨人啊&#xff09; 什么是计算机的…

WPF 零基础入门笔记(1):WPF静态页面,布局+样式+触发器(更新中)

文章目录 官方文档往期回顾零基础笔记项目实战&#xff08;已完结&#xff09; WPF项目创建为什么选net core版本 WPF 静态页面WPF 页面布局WPF样式 官方文档 往期回顾 零基础笔记 WPF 零基础入门笔记&#xff08;0&#xff09;&#xff1a;WPF简介 项目实战&#xff08;已…

github 代码实战pycharm

文章目录 下载代码配置环境进入环境下载数据集使用pycharm训练模型 下载代码 配置环境 conda env create -f environment.yml 进入环境 conda activate pytorch-CycleGAN-and-pix2pix 下载数据集 搜索download_pix2pix_dataset.sh然后用记事本打开&#xff0c;会发现有一个…

SpringBoot 疫苗接种管理系统 -计算机毕设 附源码83448

SpringBoot疫苗接种管理系统 摘 要 在目前的形势下&#xff0c;科技力量已成为我国的主要竞争力。而在科学技术领域&#xff0c;计算机的使用逐渐达到成熟&#xff0c;无论是从国家到企业再到家庭&#xff0c;计算机都发挥着其不可替代的作用&#xff0c;可以说计算机的可用领…

【软件架构】软件的设计图纸(用例图,类图,状态图,活动图,顺序图)

【软件架构】软件的设计图纸(用例图&#xff0c;类图&#xff0c;状态图&#xff0c;活动图&#xff0c;顺序图)_bdview的博客-CSDN博客 按图索骥---软件的设计图纸 序&#xff1a; 我一直以为&#xff0c;在软件设计中&#xff0c;各种图要比文档重要的多。图可以更加直接的…

RocketMQ 常见面试题(二)

broker如何处理拉取请求的&#xff1f; Broker处理拉取请求的具体流程如下&#xff1a; 客户端向Broker发送拉取请求&#xff0c;请求指定要拉取的主题名称和消费者组信息。 Broker首先会检查该消费者组是否已经存在&#xff0c;如果不存在则会创建该消费者组&#xff0c;并为…

Dubbox是什么,如何整合SpringBoot,有什么优势?

目录 一、Dubbox 是什么 二、Dubbox 如何整合SpringBoot 三、Dubbox 有什么优势 一、Dubbox 是什么 Dubbox是一款基于Java语言的分布式服务框架&#xff0c;是阿里巴巴公司开源的一款服务化治理框架&#xff0c;其前身为Dubbo。Dubbox是针对Dubbo进行了改进和升级&#xff…

akima 插值拟合算法 Python/C++/C版本

目录 前言Akima简介Akima优势 算法的代码实现python版C 版代码解析1代码解析2代码解析3 C版 实验对比 前言 鉴于“长沙等你”网站上Akima算法文章大部分要VIP观看或者下载&#xff0c;即使是付费也有质量不佳&#xff0c;浪费Money也浪费时间。 笔者根据查到的资料分享给大家。…

第5章 链路层

1、局域网的协议结构一般不包括&#xff08; &#xff09; A. 数据链路层B. 网络层C. 物理层D. 介质访问控制层 逻辑链路控制子层、介质访问控制子层、物理层 2、下列关于二维奇偶校验的说法&#xff0c;正确的是&#xff08; &#xff09; A. 可以检测和纠正双比特差错B…

NodeJS 了解和快速入门 - 实现 http 服务 操作 mysql

目录 1. 介绍 NodeJS 2. NodeJS 快速入门 3. NodeJS 实现 Httpserver 服务 4. NodeJS 操作 MySQL 数据库 1. 介绍 NodeJS 1. Node 是一个让 JavaScript 运行在服务端的开发平台, 它让 JavaScript成为与 PHP, Python, Perl, Ruby 等服务端语言平起平坐的脚本语言, 发布于 200…

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

VUE L 表单数据过滤器 ⑨

目录 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持✨ V u e j s Vuejs Vuejs收集表单数据过滤器 使用 C o o k i e Cookie Cookie 影响总结 文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹…

如何将Springboot项目升级成Springcloud项目

本文以nacos为例 分为以下几个步骤 1. 下载nacos软件 2. pom文件配置 3. application.yml文件配置 4. 代码调用 5. 效果展示 一 . 下载nacos软件 1.1 下载nacos-server-2.2.0-BETA这个版本 1.2 修改nacos配置文件 打开bin目录下的startup.cmd&#xff0c;将第26行的 set MO…

【计算机网络】第二章 物理层(下)

文章目录 2.5 信道的极限容量2.5.1 奈氏准则2.5.2 香农公式2.5.3 练习题 2.6 章节小结2.7 章节习题 2.5 信道的极限容量 2.5.1 奈氏准则 理想低通信道的最高码元传输速率 2W Baud 2W 码元 / 秒 理想带通信道的最高码元传输速率 W Baud W 码元 / 秒 W : 信道带宽&#xff08…

OZON、雅虎自养号测评如何塑造伪装度极高的测评环境

在测评领域&#xff0c;每个卖家和工作室都深知&#xff1a;创建安全可靠的网络环境对于未来发展是至关重要的。如何打造一个伪装度极高的评测环境&#xff0c;这一问题始终困扰着许多人。 从早期的虚拟机、模拟机、云手机、VPS等系统方案成本高且成号率低。因此&#xff0c;一…

php对接微信公众号扫码登录开发实录(H5微信扫描登录、服务出现故障调试、模版消息设置、扫码轮询交互)

微信公众号扫码登录开发实录 前言一、服务器配置1.微信公众号配置2.本地服务器验证程序 二、生成登录二维码1.生成微信登录二维码2.封装成便于刷新的函数 三、扫码验证和交互四、模版消息设置五、开发中遇见的问题1.该公众号提供的服务出现故障&#xff0c;请稍后再试&#xff…

区分 scanf和printf、fscanf和fprintf、sscanf和sprintf函数

文章目录 前言scanf和printffscanf和fprintfsscanf和sprintf总结 前言 C语言中&#xff0c;许多函数的函数名过于相似&#xff0c;使用者要是不能很好地区分这些函数&#xff0c;就会造成误用&#xff0c;最终导致代码的结果大相径庭。对于scanf和printf函数、fscanf和fprintf…

Xcode 15 beta 2 (15A5161b) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布)

Xcode 15 beta 2 (15A5161b) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布) IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 此版本已加入 visonOS 支持。 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-15/&#xff0c;查看最新版。原创作品&#…

UWB测距方案|3C门店展示防丢报警方案,优化防盗设计提升购机体验

目前市场上最常见的3C产品&#xff08;如手机&#xff0c;平板电脑&#xff0c;电脑等&#xff09;展示防盗是采用有线防盗技术&#xff0c;即底座&#xff0c;防盗线以及警报触头组成。以线下手机营业厅为例&#xff0c;防盗线的长度直接限制了体验者的活动范围&#xff0c;没…