【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 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;

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图书推荐管理系统Python,基于Django和协同过滤算法等实现

一、介绍 图书推荐系统 / 图书管理系统,以Python作为开发语言,基于Django实现,使用协同过滤算法实现对登录用户的图书推荐。 二、效果展示 三、演示视频 视频代码:https://www.yuque.com/ziwu/yygu3z/gq555ph49m9fvrze 四、Dj…

http长连接与会话保持

"我们半推半就的人生,没有和你一样被眷顾的未来!" 一、Http长连接 (1) 为什么需要长连接 如上展示的是一个常规得并不能再常规的http服务,从本地拉取远端linux上的本地文件上传至浏览器上,经过浏览器的渲染展示成如今的样子。唔&a…

数学建模——曲线拟合

一、曲线拟合简介 1、曲线拟合问题的提法 已知一组数据(二维),即平面上n个点 (xi,yi)(i1,2,…,n), xi互不相同。寻求一个函数yf(x),使得f(x)在某种准则下与所有的数据点最为接近,即拟合得最好。 2、…

Java Stream 流进行根据元素某一属性过滤计算其他属性实例

设计一个测试类Tuser package org.example;import com.alibaba.fastjson.annotation.JSONField;import java.io.Serializable;public class Tuser implements Serializable {//用户名private String name;//平台名称private String sys;//登录次数private int times;//一个合并…

H5学习期间 问题文档(更新中)

目录 一、html与css中让标签 二、css鼠标滑入显示div 三、git报错解决方案 四、ul>li中给h1标签设置行高 一、html与css中让标签<li>在同一行显示 li标签一行显示 效果展示&#xff1a; 代码块&#xff1a; <!DOCTYPE html> <html lang"en"…

python 深度学习 解决遇到的报错问题2

目录 一、解决报错UnicodeDecodeError: utf-8 codec cant decode byte 0xe3 in position 15: invalid continuation byte 二、解决ERROR: Could not build wheels for pycocotools, which is required to install pyproject.toml-based pro 三、解决OSError: [WinError 1314…

Redhat7.6安装mysql5.7

环境准备&#xff1a;硬盘剩余空间最少8G,内存剩余最少2G Mysql官网下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html 在Mysql官网下载列表中选择需要安装的版本: RedHat7.6安装MySQL5.7 安装之前&#xff0c;先要保证系统环境是干净的&#xff0c;不能存…

Mysql锁机制介绍

Mysql锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除传统的计算资源(如CPU、RAM、I/O等)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0…

docker部署rabbitmq

拉取镜像 我部署的是3.8版本的 docker pull rabbitmq:3.8 启动容器 docker run -d --hostname my-rabbit --name rabbitmq --restart always -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 --privilegedtrue rabbitmq:3.8 启…

【Verilog HDL】FPGA-testbench基础知识

&#x1f389;欢迎来到FPGA专栏~testbench基础知识 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能…

【网络原理之一】应用层协议、传输层协议UDP和TCP,TCP的三次握手和四次挥手以及TCP的可靠和效率机制

应用层协议XML协议JSONHTTP 传输层协议UDP协议UDP的特点UDP协议格式 TCP协议TCP的特点TCP协议格式TCP的安全和效率机制确认应答(可靠机制)超时重传(可靠机制)连接管理(可靠机制)三次握手(连接过程)四次挥手(断开的过程)状态的转化 滑动窗口(效率机制)流量控制(可靠机制)拥塞控制…

【码银送书第一期】通用人工智能:初心与未来

目录 前言 正文 内容简介 作者简介 译者简介 目录 前言 自20世纪50年代图灵在其划时代论文《计算机器与智能》中提出“图灵测试”以及之后的达特茅斯研讨会开始&#xff0c;用机器来模仿人类学习及其他方面的智能&#xff0c;即实现“人工智能”&#xff08;Artificial …

最优化问题matlab求解-fminsearch()和fmincon()函数的使用

matlab可以求解无约束最优化问题、有约束最优化问题和线性规划、二次型规划问题等&#xff0c;同时实现了最小二乘法的曲线拟合方法。matlab求解优化问题的步骤为&#xff1a; 写标准型描述目标函数&#xff1a;M-函数或匿名函数用fminunc()或fmincon()等函数求解原问题。检验…

【从删库到跑路】MySQL系列——详细讲解SQL的DDL,DML,DQL,DCL语句

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;关系型数据库⭐概念⭐特点 &#x1f354;MySQL数…

开发工具-网络测试工具 POSTMAN 的脚本使用

开发工具-网络测试工具 POSTMAN 的脚本使用 postman 脚本应用基础设置变量、获取变量示例环境变量的使用测试 发送请求示例常用的变量、方法responseBody 获取响应体内容pm.response 获取响应信息pm.expect() JSON检查cheerio.load() 类似于 jquery 操作 html 元素 POSTMAN 是网…

RabbitMQ入门指南

人生永没有终点。只有等到你瞑目的那一刻&#xff0c;才能说你走完了人生路&#xff0c;在此之前&#xff0c;新的第一次始终有&#xff0c;新的挑战依然在&#xff0c;新的感悟不断涌现。 文章目录 一、MQ与RabbitMQ概述1. MQ简述2. MQ的优势3. MQ的劣势4. 常见的MQ产品5. Rab…

MySQL 数据库

文章目录 数据库的基本概念数据表数据库数据库管理系统数据库系统 数据库的发展史当今主流数据库介绍SQL Server &#xff08;微软公司产品&#xff09;Oracle &#xff08;甲骨文公司产品&#xff09;DB2 &#xff08;IBM公司产品&#xff09;MySQL &#xff08;甲骨文公司收购…

Spring Boot日志文件

目录 前言&#x1f36d; 一、日志的作用&#x1f36d; 1、日志真实使用案例&#xff1a;&#x1f349; 二、日志怎么用&#x1f36d; 1、自定义日志打印&#x1f349; Ⅰ、在程序中得到日志对象&#x1f353; 常见的日志框架说明&#xff08;了解&#xff09;&#x1f35…

保姆级AT32F437 配置RT-Thread 以太网(UDP/TCP Server)

好记性不如烂笔头&#xff0c;既然不够聪明&#xff0c;就乖乖的做笔记&#xff0c;温故而知新。 本文档用于本人对知识点的梳理和记录。 一、前言 ENV版本&#xff1a;v1.3.5 rt-thread版本&#xff1a;V5 开发板&#xff1a;雅特力AT32F437 AT-START-F437 二、ENV配置 E…

java--类变量与实例变量--实验设计--村庄种树

目录 设计要求 设计流程图 程序代码 类Village代码 类MainClass代码 可以直接运行的代码 运行结果 类变量与实例变量的区别和类方法与实例方法的区别 idea的详细使用方法 设计要求 编写程序模拟两个村庄共同拥有一片森林&#xff1b;编写一个Village类&#xff0c;该类…