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

请添加图片描述

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

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

请添加图片描述

分析函数的点点滴滴

  • 1.什么是分析函数:
    • 1.1统计分析函数略解
    • 1.2.排序分析函数
    • 1.3 开窗函数 ROW 与 RANGE
      • 1.3.1`range`的窗口范围是`负无穷 ~ 当前值(range逻辑行,当前行与行中的值有关,所以到当前值)`,负无穷是每个组的最上面,正无穷在每个组的下面
      • 1.3.2`rows`看的是物理行,与行中的值是没有关系的
      • 1.3.3 将`first_value`换成 `last_value`,观察 `range`和 `rows`
      • 1.3.4 自定义`rows between ... preceding and ...`
      • 1.3.5 自定义`range between ... preceding and ...`
    • 1.4 统计分析函数详解
      • 1.4.1 分析函数使用sum()进行累计
      • 1.4.2 使用count()进行累计
      • 1.4.3 使用max()进行求最大值
    • 1.5 不使用order by时

1.什么是分析函数:

👉:传送门💖分析函数💖

1.1统计分析函数略解

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

1.2.排序分析函数

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

1.3 开窗函数 ROW 与 RANGE

  • row 物理行 与行中的值是没有关系的

  • range 逻辑行 与行中的值是有关系的

select e.*,first_value(empno) over (partition by deptno order by sal) rn 
from emp e;select e.*,first_value(empno) over (partition by deptno order by sal range between unbounded preceding and current row -- 忽略的Windows子句,与上面没有加Windows子句的sql命令的作用是一样的 
) rn
from emp e;
  • range between unbounded preceding and current row指定了要统计的窗口范围,这个窗口范围也是面向行的,只是比partiton更细,先partiton分组,再按组里面看窗口范围

1.3.1range的窗口范围是负无穷 ~ 当前值(range逻辑行,当前行与行中的值有关,所以到当前值),负无穷是每个组的最上面,正无穷在每个组的下面

  • 所以用first_value的时候,不加range between unbounded preceding and current row这个子句是没有问题的,因为总能统计到第一行
    在这里插入图片描述

1.3.2rows看的是物理行,与行中的值是没有关系的

select e.*,first_value(empno) over (partition by deptno order by sal rows between unbounded preceding and current row
) rn
from emp e;

在这里插入图片描述

1.3.3 将first_value换成 last_value,观察 rangerows

select e.*,last_value(empno) over (partition by deptno order by salrange between unbounded preceding and current row) rn
from emp e;

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

select e.*,last_value(empno) over (partition by deptno order by salrows between unbounded preceding and current row) rn
from emp e;

在这里插入图片描述

1.3.4 自定义rows between ... preceding and ...

select e.*,last_value(empno) over (partition deptno order by salrows between 1 preceding and 1 following) rn
from emp e;
  • 1 preceding代表的是当前行的前一行, 1 FOLLOWING 则代表的是当前行的后一行
    在这里插入图片描述
  • 如果写成unbounded following
    • UNBOUNDED FOLLOWING 表示在窗口函数中不限制窗口范围的结束位置,也就是说窗口的结束位置一直延伸至最后一行
      在这里插入图片描述

1.3.5 自定义range between ... preceding and ...

  • 因为range是逻辑行,与值有关,所以在...中填写的内容应该根据表格中的值来决定
select e.*,last_value(empno) over (partition by deptno order by salrange between 400 preceding and 400 following) rn
from emp e;

在这里插入图片描述

1.4 统计分析函数详解

1.4.1 分析函数使用sum()进行累计

select t.*,sum(sal) over(partition by deptno order by sal) cum_sum from emp t; -- 分析函数可以写group by,但是不需要
  • order by后面默认忽略了一个子句range between unbounded preceding and current row ,即默认忽略了一个逻辑行的(-∞~当前值)的子句

    • 但是从下图中可以看出,当有两行的值一样的时候,其实并没有达到我们想要的累计效果
      在这里插入图片描述
  • 使用rows进行改进,以达到想要的累计效果

select t.*,sum(sal) over(partition by deptno order by sal rows between unbounded preceding and current row) cum_sum
from emp t;

在这里插入图片描述

  • Oracle:
select t.*,sum(sal) over(partition by deptno order by sal rows between unbounded preceding and current row) cum_sum
from emp t;

在这里插入图片描述

select t.*,sum(sal) over(partition by deptno order by sal,rowid) cum_sum -- 使用rowid,相当于实现了一个物理行的统计
from emp t;
# oracle 也可以使用rowid,因为rowid是指向内存的唯一的地址,是决定数据库如果找到记录的,这个行号是唯一的	 

在这里插入图片描述

1.4.2 使用count()进行累计

select t.*,count(sal) over(partition by deptno order by sal,rowid) cum_sum
from emp t;
# 效果与row_number() over()有点像

在这里插入图片描述

1.4.3 使用max()进行求最大值

select t.*,max(sal) over(partition by deptno order by sal) cum_sum -- 求得是最大值,所以就不能用物理行了
from emp t;

在这里插入图片描述

1.5 不使用order by时

# 按照部门编号进行分区,然后使用sum()得到每个组的薪水和
select t.*,sum(sal) over(partition by deptno) cum_sum 
from emp t;

在这里插入图片描述

# 统计每组有薪水的人数,因为count()动态忽略null
select t.*,count(sal) over(partition by deptno) cum_sum 
from emp t;

在这里插入图片描述

# 求出了所有人的薪水和
# 分析函数不会减少行数,数据有几行,求完和的结果就有几行
select t.*,sum(sal) over cum_sum
from emp t;

在这里插入图片描述

  • 求占比
select sal,sal/sum(sal) over() cum_sum,sal/(select sum(sal) from emp) from emp;

在这里插入图片描述

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

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

相关文章

【Java-SpringBoot+Vue+MySql】前后端分离项目云端部署

目录 部署环境: 安装MYSQL: 安装Nginx 安装配置JDK 远程连接数据库 前端打包 后端打包 心得: 部署环境: CentOS7.6 MySQL5.7 JDK1.8 Nginx1.8 下载MySQL MySQL :: Download MySQL Community Server (Archived Versions) …

【探索 Kubernetes|作业管理 Deployment 篇 系列 12】水平扩展 / 收缩、滚动 / 回滚更新

前言 大家好,我是秋意零。 在上一篇中,我们介绍了控制器的基本设计思想:控制器模式。通过这个 “控制器模式” 我们来看看 Deployment 是如何依靠它来实现的。 最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位…

IBM N系列存储和NetApp FAS之间的对应关系

IBM在很长一段时间都是OEM NetApp的FAS存储作为他的NAS产品线,在IBM叫做Storage N series,就是N系列,在2014年IBM终止了和NetApp之间的OEM关系,目前在市场上的OEM的NetApp存储型号主要是 FAS3000,FAS31和FAS32的中端系…

MySQL-SQL视图详细

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

chatgpt赋能python:同一个python文件能同时运行多次吗?

同一个python文件能同时运行多次吗? Python作为一种高级编程语言,具有丰富的语法和功能。在编写Python程序时,我们常常需要考虑不同的需求。有时我们可能需要使用相同的python文件运行不同的程序,这时候很自然的问题就会出现&…

数据结构--单链表的查找

数据结构–单链表的查找 均以带头结点链表为例 目标: GetElem(Li):按位查找操作。获取表L中第i个位置的元素的值。 LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。 按位查找 按位查找,返回第i 个元素(带头结点) 代码实现 typ…

Diffusion详细学习

解决报错 https://zhuanlan.zhihu.com/p/622238031 原理:https://zhuanlan.zhihu.com/p/612854566 解决内存溢出问题 溢出问题 总结下来:batch_size 和 n_samples 调节 原理学习 扩散模型是一种生成模型,用于生成与训练数据相似的数据。…

go语言学习笔记1

go语言简介 ​ GoLang是一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;它可以在不损失应用程序性能的情况下极大的降低代码的复杂性,还可以发挥多核处理器同步多工的优点,并可解决面向对象程序设计的麻烦&#x…

架构基本概念和架构本质

什么是架构和架构本质 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础…

从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题

目录 1. 多态(polymorphism) 1.1 构成多态的两个条件 1.2 虚函数重写(覆盖) 1.3 协变构成多态 1.4 父虚子非虚构成多态 1.5 析构函数的重写 1.6 final 和 override 关键字(C11) 1.7 重载、覆盖、隐藏的对比 2. 抽象类&am…

Mysql_5.7下载及安装(CentOS7)

文章目录 安装MySQL的几种方式一、 使用docker安装MySQL1.1 卸载旧版本(如果存在docker,需先卸载旧版本)1.2 安装Docker使用存储库安装(推荐使用) 1.3 安装mysql5.7.35(普通用户下)*** 安装MySQL:5.7.35镜像*** 进入容器中查看配置文件以及数…

结构化GPT用例,在CSDN私密社区中死磕@ada 探索SpringBoot

在CSDN私密社区中死磕ada 探索SpringBoot Q: Spring的核心概念是哪些?Q: Spring MVC的核心概念是哪些?Q: SpringBoot的核心概念有哪些?Q: 介绍下SpringBoot AutoConfiguration的机制。Q: SpringBootConfiguration 和 Configuration 的区别是&…