T天池SQL训练营(五)-窗口函数等

news2025/1/15 22:55:38

–天池龙珠计划SQL训练营

5.1窗口函数

5.1.1窗口函数概念及基本的使用方法

窗口函数也称为OLAP函数。OLAP 是OnLine AnalyticalProcessing 的简称,意思是对数据库数据进行实时分析处理。
为了便于理解,称之为窗口函数。常规的SELECT语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某一部分数据进行汇总、计算和排序。
窗口函数的通用形式:

<窗口函数> OVER ([PARTITION BY <列名>]
                     ORDER BY <排序用列名>)

[]中的内容可以省略。
窗口函数最关键的是搞明白关键字****PARTITON BY
ORDER BY*****的作用。
PARTITON BY是用来分组,即选择要看哪个窗口,类似于GROUP BY 子句的分组功能,但是PARTITION BY 子句并不具备GROUP BY 子句的汇总功能,并不会改变原始表中记录的行数。
ORDER BY是用来排序,即决定窗口内,是按那种规则(字段)来排序的。
举个栗子:

SELECT product_name
       ,product_type
       ,sale_price
       ,RANK() OVER (PARTITION BY product_type
                         ORDER BY sale_price) AS ranking
  FROM product

得到的结果是:
image.png
我们先忽略生成的新列 - [ranking], 看下原始数据在PARTITION BY 和 ORDER BY 关键字的作用下发生了什么变化。
PARTITION BY 能够设定窗口对象范围。本例中,为了按照商品种类进行排序,我们指定了product_type。即一个商品种类就是一个小的"窗口"。
ORDER BY 能够指定按照哪一列、何种顺序进行排序。为了按照销售单价的升序进行排列,我们指定了sale_price。此外,窗口函数中的ORDER BY与SELECT语句末尾的ORDER BY一样,可以通过关键字ASC/DESC来指定升序/降序。省略该关键字时会默认按照ASC,也就是
升序进行排序。本例中就省略了上述关键字 。
image.png

5.2窗口函数种类

大致来说,窗口函数可以分为两类。
一是 将SUM、MAX、MIN等聚合函数用在窗口函数中
二是 RANK、DENSE_RANK等排序用的专用窗口函数

5.2.1专用窗口函数

  • **RANK函数 **(英式排序)

计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位……

  • DENSE_RANK函数**(中式排序)**

同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位……

  • ROW_NUMBER函数

赋予唯一的连续位次。
例)有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位
运行以下代码:

SELECT  product_name
       ,product_type
       ,sale_price
       ,RANK() OVER (ORDER BY sale_price) AS ranking
       ,DENSE_RANK() OVER (ORDER BY sale_price) AS dense_ranking
       ,ROW_NUMBER() OVER (ORDER BY sale_price) AS row_num
  FROM product

image.png

5.2.2聚合函数在窗口函数上的使用

聚合函数在开窗函数中的使用方法和之前的专用窗口函数一样,只是出来的结果是一个累计的聚合函数值。
运行以下代码:

SELECT  product_id
       ,product_name
       ,sale_price
       ,SUM(sale_price) OVER (ORDER BY product_id) AS current_sum
       ,AVG(sale_price) OVER (ORDER BY product_id) AS current_avg  
  FROM product;

image.png
image.png
可以看出,聚合函数结果是,按我们指定的排序,这里是product_id,当前所在行及之前所有的行的合计或均值。即累计到当前行的聚合。

5.3窗口函数的的应用 - 计算移动平均

在上面提到,聚合函数在窗口函数使用时,计算的是累积到当前行的所有的数据的聚合。 实际上,还可以指定更加详细的汇总范围。该汇总范围成为框架(frame)。
语法

<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS n PRECEDING )  
                 
<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS BETWEEN n PRECEDING AND n FOLLOWING)

PRECEDING(“之前”), 将框架指定为 “截止到之前 n 行”,加上自身行
FOLLOWING(“之后”), 将框架指定为 “截止到之后 n 行”,加上自身行
BETWEEN 1 PRECEDING AND 1 FOLLOWING,将框架指定为 “之前1行” + “之后1行” + “自身”
执行以下代码:

SELECT  product_id
       ,product_name
       ,sale_price
       ,AVG(sale_price) OVER (ORDER BY product_id
                               ROWS 2 PRECEDING) AS moving_avg
       ,AVG(sale_price) OVER (ORDER BY product_id
                               ROWS BETWEEN 1 PRECEDING 
                                        AND 1 FOLLOWING) AS moving_avg  
  FROM product

执行结果:
注意观察框架的范围。
ROWS 2 PRECEDING:
image.png
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING:
image.png

5.3.1窗口函数适用范围和注意事项

  • 原则上,窗口函数只能在SELECT子句中使用。
  • 窗口函数OVER 中的ORDER BY 子句并不会影响最终结果的排序。其只是用来决定窗口函数按何种顺序计算。

5.4GROUPING运算符

5.4.1ROLLUP - 计算合计及小计

常规的GROUP BY 只能得到每个分类的小计,有时候还需要计算分类的合计,可以用 ROLLUP关键字。

SELECT  product_type
       ,regist_date
       ,SUM(sale_price) AS sum_price
  FROM product
 GROUP BY product_type, regist_date WITH ROLLUP

得到的结果为:
image.png
image.png
这里ROLLUP 对product_type, regist_date两列进行合计汇总。结果实际上有三层聚合,如下图 模块3是常规的 GROUP BY 的结果,需要注意的是衣服 有个注册日期为空的,这是本来数据就存在日期为空的,不是对衣服类别的合计; 模块2和1是 ROLLUP 带来的合计,模块2是对产品种类的合计,模块1是对全部数据的总计。
ROLLUP 可以对多列进行汇总求小计和合计。
image.png

练习题

5.1

请说出针对本章中使用的product(商品)表执行如下 SELECT 语句所能得到的结果。

SELECT  product_id
       ,product_name
       ,sale_price
       ,MAX(sale_price) OVER (ORDER BY product_id) AS Current_max_price
  FROM product

** 答:按照 product_id 升序排列,计算出截⾄当前⾏的最⾼ sale_price 。 **

5.2

继续使用product表,计算出按照登记日期(regist_date)升序进行排列的各日期的销售单价(sale_price)的总额。排序是需要将登记日期为NULL 的“运动 T 恤”记录排在第 1 位(也就是将其看作比其他日期都早)

-- ①regist_date为NULL时,显示“1年1⽉1⽇”。
SELECT regist_date, product_name, sale_price,
 SUM(sale_price) OVER (ORDER BY COALESCE(regist_date, CAST('0001-01-01'
AS DATE))) AS current_sum_price
 FROM Product;
 
-- ②regist_date为NULL时,将该记录放在最前显示。
SELECT regist_date, product_name, sale_price,
 SUM(sale_price) OVER (ORDER BY regist_date NULLS FIRST) AS
current_sum_price
 FROM Product;

5.3

思考题
① 窗口函数不指定PARTITION BY的效果是什么?
答: 窗⼝函数不指定 PARTITION BY 就是针对排序列进⾏全局排序
② 为什么说窗口函数只能在SELECT子句中使用?实际上,在ORDER BY 子句使用系统并不会报错。

答: 本质上是因为 SQL 语句的执⾏顺序。 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 如果在 WHERE, GROUP BY, HAVING 使⽤了窗⼝函数,就是说提前进⾏了⼀次排序,排序之后再去除 记录、汇总、汇总过滤,第⼀次排序结果就是错误的,没有实际意义。⽽ ORDER BY 语句执⾏顺序在 SELECT 语句之后,⾃然是可以使⽤的。

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

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

相关文章

elasticsearch-head 启动教程

D:\elasticsearch-head-master>grunt server ‘grunt’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 npm install -g grunt-clinpm install

资源三号5米全国数字高程模型DEM

简介 近些年来&#xff0c;国产高分辨率遥感卫星的发展突飞猛进&#xff0c;天绘系列卫星、资源三号卫星、高分一号、二号卫星以不断提高的影像空间分辨率、逐步增强的影像获取能力、较好的影像现势性等特点逐步打破了国外商业卫星的主导地位&#xff0c;开始广泛服务于各…

Andorid sudio 换行方法

1.遇到的问题&#xff0c;二维码内容要换行 String text "成绩&#xff1a;1000 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff1a;张三 \n姓名&#xff…

Java数字化健康卫生智慧云HIS系统源码

基于云计算技术的B/S架构云HIS集挂号、处方、收费、取药、病历于一体,完全适配各类中小型医院、诊所。 一、云 HIS定义 1、云 HIS 系统是运用云计算、大数据、物联网等新兴信息技术&#xff0c;按照现代医疗卫生管理要求&#xff0c;在一定区域范围内以数字化形式提供医疗卫生…

细讲结构体

结构体是一些值的集合&#xff0c;这些值就是成员变量&#xff0c;这些变量可以是不同类型的。 当我们存放一个学生的信息是&#xff0c;包括性别&#xff0c;姓名&#xff0c;学号&#xff0c;年龄等内容&#xff0c;这些值是不同类型的&#xff0c;这是我们就可以使用结构体来…

实战rce绕过getshell曲折经历

tp rce漏洞 该网站debug显示该站点的tp版本为5.0.5&#xff0c;宝塔搭建 直接上rce payload 执行成功 问题点&#xff1a; 1.此站点disable_functions函数基本都禁用了&#xff0c;另外加载了禁用eval的扩展 2.web目录不允许出现.php后缀文件&#xff0c;写入后会立即删除 绕…

名创优品出海更难了,Q3净利增速放缓

近日&#xff0c;有媒体报道称&#xff0c;名创优品受市场流传针对公司的做空报告&#xff0c;叠加高管团队两次减持&#xff0c;共计180万股&#xff0c;若对应25美元的价格&#xff0c;则达4500万美元(约3.2亿元)。 12月5日&#xff0c;其港股收盘股价下跌14.04%&#xff1b…

本地团购分销:解密最新赚钱模式,带你开启财富之门!APP小程序H5三端源码交付,支持二开!

近年来&#xff0c;随着互联网的迅猛发展和电子商务的普及&#xff0c;本地团购分销逐渐成为了一种热门的赚钱模式。它不仅为消费者提供了更多的购物优惠&#xff0c;同时也给商家和分销商带来了可观的利润。在这篇文章中&#xff0c;我们将详细介绍本地团购分销的运作原理和盈…

15Linux、GIT及相关相似面试题、PostMan

Linux和git相似是命令相关的层次结构相似 Linux Linux Linux常用操作_linux操作-CSDN博客 程序员常用的10个Linux命令_简介linux系统中的10个常用命令及功能-CSDN博客 help help 命令 &#xff1a;获得 shell 内置命令的帮助信息&#xff0c;常用形式 help cd ls --help …

【C/PTA —— 15.结构体2(课内实践)】

C/PTA —— 15.结构体2&#xff08;课内实践&#xff09; 7-1 计算职工工资7-2 计算平均成绩7-3 找出总分最高的学生7-4 通讯录的录入与显示 7-1 计算职工工资 #include<stdio.h> #include<stdlib.h> typedef struct GZ {char name[6];double j;double f;double z;…

【Python系列】Python函数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

2023 金砖国家职业技能大赛网络安全省赛理论题样题(金砖国家未来技能挑战赛)

2023 金砖国家职业技能大赛网络安全省赛理论题样题&#xff08;金砖国家未来技能挑战赛&#xff09; 一、参加比赛的形式 团队参与&#xff0c;每队2名选手&#xff08;设队长1名&#xff09;。 二、项目项目阶段简介 项目由四个阶段组成&#xff0c;将按顺序完成。向参与者…

21、命令执行

文章目录 一、命令执行概述1.1 基本定义1.2 原理1.3 两个条件1.4 命令执行漏洞产生的原因1.5 管道符号和通用命令符 二、远程命令执行2.1 远程命令执行相关函数2.2 远程命令执行漏洞的利用 三、系统命令执行3.1 相关函数3.2 系统命令执行漏洞利用 四、命令执行漏洞防御 一、命令…

[python库] mistune库的基本使用

前言 mistune库是一个解析Markdown的利器&#xff0c;使用起来非常简单。当我们想要解析Markdown格式的文档时&#xff0c;只需两步就能将其转换成html格式。如下&#xff1a; import mistune mistune.html(YOUR_MARKDOWN_TEXT)安装方式也非常简单&#xff0c;dddd&#xff1…

qt creator配置opencv库 (MSVC版本)

目录 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 1.4 新建qt项目 1. MSVC版本 1.1 使用cmake编译opencv 1.2 再使用visual studio 2019生成opencv的lib,dll 1.3 配置opencv的系统环境变量 D:…

图形视图【例】对数计算尺

文章目录 对数计算尺 &#x1f4cf;示例代码 对数计算尺 &#x1f4cf; 对数可以有效地把乘法转换成加法运算,比如: l n A ∗ B l n A l n B ln^{A*B} ln^{A} ln^{B} lnA∗BlnAlnB 对数计算尺就是利用对数性质把乘法换成加法的一种辅助工具. 图片来自《程序员的数学1》 …

C //习题10.4 有两个磁盘文件“A“和“B“,各存放一行字母,今要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件“C“中去。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 习题10.4 习题10.4 有两个磁盘文件"A"和"B"&#xff0c;各存放一行字母&#xff0c;今要求把这两个文件中的信息合并&#xff08;按字母顺序排列&#xff09;&#xff0c;输出到一个新文件"C"…

智能优化算法应用:基于爬行动物算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于爬行动物算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于爬行动物算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.爬行动物算法4.实验参数设定5.算法结果6.参考…

【Jeecg Boot 3 - 保姆级】第1节 docker + redis + nginx + redis一键安装启动

一、前言 ▶ JEECG-BOOT 开源版难以吃透的原因 ▶ 为了针对上面痛点&#xff0c;笔者做了如下安排 ▶ 你能收获什么 二、效果(第一节效果) ▶ 启动后端 &#xff1e; 日志 &#xff1e; 接口文档 ▶ 启动前端 三、准备工作 四、实战 ▶ 1、服务器安装 Stag…

如何配置Modbus转Profinet网关与6台232 Modbus伺服通信

Modbus转Profinet网关连接6台232 Modbus伺服同时控制的解决方案不仅简化了设备连接&#xff0c;还减少了人力投入和维护成本。通过Modbus转Profinet网关&#xff0c;操作人员只需对Profinet网关进行设置和监控&#xff0c;即可实现对6台232 Modbus伺服的集中控制。 Modbus转Pro…