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

news2024/11/17 12:58:44

请添加图片描述

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

本文收录于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 sal
       range between unbounded preceding and current row) rn
from emp e;

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

select e.*,
	   last_value(empno) over (partition by deptno order by sal
       rows 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 sal
       rows 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 sal
       range 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.coloradmin.cn/o/661349.html

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

相关文章

Linux中新建用户使用sudo问题

文章目录 sudo问题 sudo问题 sudo:权限提示指令,当使用sudo这条指令时,会将普通用户的权限提升为root权限 但是在命令行新建用户,这个用户使用sudo指令对一条指令提权是用不了的 这个用户没有在sudoers file这个文件中&#xff…

读发布!设计与部署稳定的分布式系统(第2版)笔记05_层叠

1. 水平扩展 1.1. 增加服务器来增加容量 1.1.1. 这些服务器集群被称为“农场” 1.2. 负载均衡的服务器集群 1.2.1. 不易遭遇单点系统失效 1.2.2. 高负载比低负载更易导致竞态条件的并发缺陷 1.3. 如果双节点集群出现失效,那么幸存服务器的工作负载将增加一倍 …

SpringBoot集成企业微信自建应用消息

目录 参考文档概述发送限制成员收不到应用推送消息的原因创建应用五、发送消息1、文本 text2、卡片文本3、图文news4、markdown 参考文档 官方文档 企业微信群机器人应用 概述 消息群发,是企业微信提供的用于企业向成员推送企业通知的工具,支持管理端…

AN13743-移植-无eSE

PN553/PN557 to PN7160 migration guidelines 1目的 本文件提供了从PN553/PN557 NFC控制器迁移到PN7160 NFC控制器的指南。它旨在从硬件和软件的角度描述PN7160 NFC控制器与PN553/PN557 NFC控制器的主要区别和新功能。软件部分逐步介绍如何适应Android开源项目 为PN553/PN55…

React学习笔记(二)组件详解

一、组件的概念: 当你开始学习 React 的时候,你会了解到 React 组件是 React 应用程序的基本构建块。组件是一个隔离的、可重复使用的代码块,由 HTML 元素、其他组件或自定义的 UI 元素组成,组件也就是react的核心思想&#xff0c…

Visual Studio Code 插件安装

目录 1、在线安装 1.1 单个插件的安装 1.2 根据配置文件一次性安装多个插件 1.3 同步配置的方式 1.3.1 第一种方式使用VSCode自带的同步功能。 1.3.2 第二种方式,首先需要先安装插件 Settings Sync 2、离线安装 2.1 去官方下载离线安装包进行安装 2.2 直接…

DolphinScheduler任务调度工具

任务调度:系统为了自动完成特定任务,在约定的特定时刻去执行任务的过程 分布式调度: 分布性:每个部分可以独立部署,服务之间通过网络通信伸缩性:每个部分可以集群部署,动态伸缩扩容高可用 jd…

IntelliJ IDEA 2022.3.1 (Community Edition)代码注释风格设置

Setting -> Editor -> Code Style -> Java -> Comment Code

Unity 之 最新Ads原生广告接入流程详解和工具类分享

Unity 之 Ads接入流程详解 一,注册 Unity Ads 广告 SDK二,下载 Unity Ads 广告 SDK三,配置 Unity Ads 广告 SDK3.1 广告位展示流程3.2 代码初始化 四,集成 Unity Ads 广告 SDK4.1 相关介绍4.2 代码分享 五,测试 Unity …

C语言变量学习2

前文已经学习了C语言变量; C语言变量_c语言变量块_bcbobo21cn的博客-CSDN博客 继续再学习;VC6新建一个单文档工程; void CVtestView::OnDraw(CDC* pDC) {CVtestDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for na…

【C语言复习】第三篇、Gitee码云的创建和使用

目录 第一部分、Gitee码云的用处 1、为什么要使用Gitee? 2、我参考的视频 第二部分、软件安装流程 1、下载Git for windows软件和TortoiseGit软件 2、Git for windows软件的安装流程 3、TortoiseGit软件软件的安装流程 第三部分、Gitee如何创建仓库&#xf…

jquery和jquery ui有什么区别

jquery和jquery ui有什么区别 jquery和jquery ui有什么区别 jQuery UI 与 jquery 的主要区别是:(1) jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。(2) jQuery UI则是在jQuery的基础上,利用jQuery的扩展性&…

企业搭建小型直播间、中型直播间、大型直播间的介绍

常用的直播间搭建大致分为实景和绿幕两种类型。实景区即公司具体场景,如会客厅、LOGO墙、海报展板以及纯白背景等,根据企业直播主题而调整;绿幕区则是通过搭建绿幕,满足企业直播过程中需要进行抠像,设置沉浸式背景的需…

国产麒麟服务器等保二级 配置规范(一)

麒麟linux的加固 1.检查设备密码复杂度策略 配置文件 vi /etc/pam.d/system-auth password requisite pam_cracklib.so ucredit-1 lcredit-1 dcredit-1 minlen6 auth required pam_tally.so deny5 unlock_time600 no_lock_time account required pam_tally.sopassword suffi…

大数据Doris(四十五):Routine Load注意事项

文章目录 Routine Load注意事项 Routine Load注意事项 1、查看作业状态的具体命令和示例可以通过 HELP SHOW ROUTINE LOAD; 命令查看。 2、用户可以通过 STOP/PAUSE/RESUME 三个命令来控制作业的停止,暂停和重启。可以通过 HELP STOP ROUTINE LOAD; HELP PAUSE ROUTINE LOA…

调用万维易源API实现证件照换装

目录 1. 作者介绍2. 万维易源API简介2.1 易源数据2.2 易源API管理2.3 调用参数简介 3. 万维易源API调用过程3.1 获取ID和代码3.2 代码实现3.3 完整代码 参考(可供参考的链接和引用文献) 1. 作者介绍 吴宇,男,西安工程大学电子信息…

LVS keepalived 集群

LVS keepalived 集群 LVS keepalived 集群一、Keepalived及其工作原理1.Keepalived体系主要模块及其作用2.健康检查的方式(探针) 二、LVSKeepalived 高可用群集部署1.LVS部署一:配置负载调度器(主、备相同)二&#xff…

FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库)

文章目录 前言系统配置任务创建动态任务创建删除实践静态任务创建删除实践 前言 接着学习正点原子的FreeRTOS教程,涉及到一些详细的系统内文件代码 系统配置 可以通过各种的宏定义来实现我们自己的RTOS配置(在FreeRTOSconfig.h) “INCLUDE…

100天精通Python(可视化篇)——第92天:Pyecharts绘制炫酷柱状图、条形图实战大全

文章目录 专栏导读1. 基础柱状图2. 旋转x轴标签3. 旋转坐标轴4. 添加坐标轴名称5. 添加标记点6. 添加标注线7. 添加数据8. 添加自定义背景图9. 堆叠柱状图10. 柱状图与折线图组合11. 三维柱状图12. 水平滑动、鼠标滚轮缩放柱状图 专栏导读 🔥🔥本文已收…

ConcurrentHashMap源码

HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当于所有线程进行读写时都去竞争一把锁,导致效率非常低下。 介绍 ConcurrentHashMap的底层原理和HashMap是比较相…