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

请添加图片描述

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

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

请添加图片描述

分析函数的点点滴滴

  • 1.什么是分析函数:
    • 1.1统计分析函数略解
    • 1.2.排序分析函数
      • 1.2.1 ==ROW_NUMBER==
        • MySQL/Oracle的通用方法
        • MySQL方法1:使用分析函数
        • MySQL方法1.1:
        • Oracle方法1:
      • 1.2.2 DENSE_RANK
      • 1.2.3rank 跳跃排序
      • 1.2.4 FIRST和LAST
      • 1.2.5 FIRST_VALUE 和 LAST_VALUE

1.什么是分析函数:

分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

  • 聚合函数会把行数变少,分析函数不会把行数变少

oracle分析函数的语法:

function_name(arg1,arg2,...) 
over 
(<partition-clause> <order-by-clause ><windowing clause>)partition-clause  数据记录集分组 
order-by-clause   数据记录集排序 
windowing clause  功能非常强大、比较复杂,定义分析函数在操作行的集合。有三种开窗方式: range、row、specifying。

1.1统计分析函数略解

  • COUNT
    功能描述:该函数计算组中表达式的个数。
  • SUM
    功能描述:该函数计算组中表达式的累积和。
  • MIN
    功能描述:在一个组中的数据窗口中查找表达式的最小值。
  • MAX
    功能描述:在一个组中的数据窗口中查找表达式的最大值。
  • AVG
    功能描述:用于计算一个组和数据窗口内表达式的平均值

1.2.排序分析函数

1.2.1 ROW_NUMBER

功能描述:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。

  • 自行扩展:oracle中rownum与row_number的区别
-- 下例返回每个员工再在每个部门中按员工号排序后的顺序号SELECT department_id,   first_name||' '||last_name employee_name,  -- 拼接了一个雇员的姓名employee_id, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id  -- 根据OVER()里面的内容使用row_number()进行排序FROM employees
-- 查找部门内最高薪水的员工信息
mysql:select empno,ename,max(sal) from emp group by empno -- select中的粒度比group by的粒度细,这在 MySQL中可以,但是我这里不行,可能是版本问题
oracle:select empno,(select min(ename) from emp where empno = e.empno) ename,max(sal) from emp e group by empno; -- 括号中的min是当一个empno对应多个ename的时候,如果对应一个ename的时候,可以不写min	 -- 括号里面使用别名是为了区分里面的emp和外面的emp,如果不加别名,默认就是里面的emp 

在这里插入图片描述

MySQL/Oracle的通用方法

select e0.* 
from emp e0,(select deptno,max(sal) sal_max from emp group by deptno) e1,
where e0.deptno = e1.deptnoand e0.sal = e1.sal_max;  -- 因为求得是部门最高薪水的员工信息,如果没有这个关联,那只是求出了最高薪水

在这里插入图片描述

MySQL方法1:使用分析函数

select * from(
select *,row_number() over (partition by deptno order by sal desc) rn from emp
) a where rn = 1; -- 如果没有外层嵌套的select * from 的话,是不可使用where rn = 1的,要时刻注意执行顺序,rn在select子句中,where的执行顺序比select早
# 而且MySQL还得加一个别名(上面的a),不加报错,Oracle不加不报错

在这里插入图片描述

MySQL方法1.1:

# 如果要求是排名前2的
select * from(select * ,row_number() over ( partition by deptno order by sal desc) rn from emp
) a where rn < 3;  -- 因为是降序排序的,也可以是 rn <= 2 或者between 1 and 2
# ★ not rn > 2 如果使用not进行反选的话,效率是很低的,而且not有时候会让索引失效,部分失效

在这里插入图片描述

# 查看每个部门每个岗位的薪水
select * ,row_number() over ( partition by deptno,job order by sal desc) rn 
from emp

在这里插入图片描述

Oracle方法1:

select * from (select e.*,  -- Oracle中如果直接使用*的话,会发生错误,原因未知,所以使用别名row_number() over (partition by deptno order by sal desc) rn from emp e
) a where rn < 3;
-- 把row理解成物理行,上面根据薪水进行排序,但是物理行的行号与薪水的值是没有关系的,会认为sal相同的数据只是不同的行,所以会给一个唯一的行号 

在这里插入图片描述

  • 扩展
select *,row_number () over (partition by deptno order by sal desc) rn
from emp;

在这里插入图片描述

1.2.2 DENSE_RANK

select * from(select *,dense_rank() over (pritition by deptno order by sal desc)rnfrom emp)awhere rn < 2;
  • dense_rank 密集的,稠密的,不间断地
    • 下图中很明显,相同的数据不进行排名(可以用同为100分的两个同学并列第一来理解,99分的同学排名第二)
      在这里插入图片描述

1.2.3rank 跳跃排序

select * from(
select *,rank() over (pritition by deptno order by sal desc)rn
from emp)a
where rn < 2;
  • 同为100分的两个同学并列第一来理解,99分的同学排名第三

在这里插入图片描述

1.2.4 FIRST和LAST

  • FIRST

功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录

  • LAST

功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录

select e.*,rank() over (partition by deptno order by sal) rn,MIN(sal) KEEP (dense_rank last order by sal) over (pritition by deptno),MAX(sal) KEEP (dense_rank first order by sal) over (partition by deptno)from emp e
  • order by 默认是升序,所以使用last取得是最大值,如果最大值有多个,通过前面的MIN(sal) KEEP来得到一个值

1.2.5 FIRST_VALUE 和 LAST_VALUE

  • FIRST_VALUE:返回组中数据窗口的第一个值。

  • LAST_VALUE:返回组中数据窗口的最后一个值

# oracle:
select e.*,LAST_VALUE(empno) over (partition by deptno order by sal) rnfrom emp e
# mysql:
create table tmp2 
select * from emp order by deptno,salselect e.*,LAST_VALUE (empno) over (partition by deptno) rn
from tmp2 e

结论:

  • mysql想取到组中按照某个字段排序得最大值或最小值对应得其他信息,得提前将表按照字段排序并物化成临时表,然后再利用分析函last_value和first_value从临时表中进行查询,才能得出正确结果

  • oracle可以直接对源表进行order by,然后用分析函数ast_value和first_value直接查询。 (待验证逻辑: order by 执行顺序最后的,但是这个例子说明orderby在前,分析函数执行在后)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列

文章目录 消息队列概述两大种类RabbitMQ安装及基操Docker中安装添加用户创建Virtual Hosts设置权限添加交换机创建队列交换机绑定队列 五种消息模型SpringBoot整合MQ引入依赖properties配置开启RabbitMQ API使用创建交换机创建队列交换机绑定队列发送消息接收消息 消息确认机制…

【Spring Cloud Alibaba Seata 处理分布式事务】——每天一点小知识

&#x1f4a7; S p r i n g C l o u d A l i b a b a S e a t a 处理分布式事务 \color{#FF1493}{Spring Cloud Alibaba Seata 处理分布式事务} SpringCloudAlibabaSeata处理分布式事务&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f98…

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录 1、EFK简介 2、EFK框架 2.1、Fluentd系统架构 2.2、Elasticsearch系统架构 2.3、Kibana系统架构 3、Elasticsearch接口 4、EFK在虚拟机中安装步骤 4.1、安装elasticsearch 4.2、安装kibana 4.3、安装fluentd 4.4、进入kibana创建索引 5、Fluentd配置介绍 Elas…

WWDC 23 之后的 SwiftUI 有哪些新功能

文章目录 前言数据流动画ScrollView搜索新手势新增的小功能总结 前言 WWDC 23 已经到来&#xff0c;SwiftUI 框架中有很多改变和新增的功能。在本文中将主要介绍 SwiftUI 中数据流、动画、ScrollView、搜索、新手势等功能的新变化。 数据流 Swift 5.9 引入了宏功能&#xff…

【FPGA】Verilog:时序电路 | 触发器电路 | 上升沿触发 | 同步置位 | 异步置位

前言&#xff1a;本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例&#xff1a;触发器电路 ​ 功能特性&#xff1a; 采用 Xilinx Artix-7 XC7A35T芯片 配置方式&#xff1a;USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器&#xff1a;…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述&#xff1a; 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”&#xff0c;同步转载于此。 背景 源码&#xff1a;…

软考A计划-系统集成项目管理工程师-项目范围管理(一)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

C# Excel 表列序号

171 Excel 表列序号 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: columnTitle “A” 输出: 1 示例 2: …

数据库原理之数据库事物

文章目录 一、事物介绍1.1 事物的目的是保证数据的一致性1.2 事物的ACID A、I、D是为了实现 C1.3 什么是本地事物(Local Transactions) 二、数据库系统如何实现ACID2.1 影响深远的ARIES理论2.2 本地事物如何实现原子性和持久性 A、D2.2.1 实现原子性和持久性的Commit Logging方…

基于物联网、区块链技术的质量管控防伪溯源系统源码

一物一码防伪溯源系统能准确获取产品生产经营各个环节的真实信息&#xff0c;利用物联网、云计算 、区块链、人工智能、5G等先进技术&#xff0c;结合特有的码码关联和RSA加密验证技术&#xff0c;建立区块链的“身份证”&#xff0c;针对产品生长到销售各环节的质量安全数据进…

结构体和数据结构--结构体数组的定义和初始化

目录 一、结构体数组的定义 二、结构体数组的初始化 一、结构体数组的定义 一个结构体变量只能表示学生成绩管理表中的一个学生的记录信息&#xff0c;代表其中的一个实例&#xff0c;而实际数据库中有多个学生的记录&#xff0c;每个记录对应一个学生的信息&#xff0c;如何…

MySQL----MHA高可用

文章目录 一、MHA理论1.1什么是 MHA1.2MHA 的组成1.3MHA 的特点 二、MHA的一主两从部署实验设计故障修复步骤&#xff1a; 一、MHA理论 1.1什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出…