开窗函数分享

news2024/9/29 5:33:15

开窗函数定义

开窗函数:用于为行定义一个窗口,它一组值进行操作,不需要使用group by子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。

划重点!!!

开窗函数返回:基础行列聚合列

下面通过例子看一下。

数据示例

0、需求
#基础数据
id	name	sex	age
1	a	男	20
2	b	女	10
3	c	男	30
4	d	男	15
5	e	女	22
#实现
id	name	sex	age	聚合列
1	a	男	20	5
2	b	女	10	5
3	c	男	30	5
4	d	男	15	5
5	e	女	22	5
1、建表语句
CREATE TABLE `student` (
  `id` int NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `sex` varchar(255) DEFAULT NULL,
  `age` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2、数据准备
INSERT INTO `test`.`student` (`id`, `name`, `sex`, `age`) VALUES (1, 'a', '男', 20);
INSERT INTO `test`.`student` (`id`, `name`, `sex`, `age`) VALUES (2, 'b', '女', 10);
INSERT INTO `test`.`student` (`id`, `name`, `sex`, `age`) VALUES (3, 'c', '男', 30);
INSERT INTO `test`.`student` (`id`, `name`, `sex`, `age`) VALUES (4, 'd', '男', 15);
INSERT INTO `test`.`student` (`id`, `name`, `sex`, `age`) VALUES (5, 'e', '女', 22);
3、不适用开窗方式实现
select
    student.*,
    student_total.cnt
from
    student
    join
    (select count(*) as cnt from student) student_total

4、使用开窗方式实现

实战

实战一:本地素材库

所需模型:

video(id,create_time,signature)

需求一:video(本地素材库)去重

select min(id) from video group by signature

需求二:video(本地素材库)去重,且获取第一次上传时的id

不开窗的的方式:

SELECT
	video.id,
	video.created_at,
	video.signature
FROM
	video
	JOIN ( SELECT signature, min( created_at ) as created_at FROM video GROUP BY signature ) tmp
	ON video.signature = tmp.signature and video.created_at = tmp.created_at

开窗的方式:

SELECT
	* 
FROM
	(
	SELECT
		video.id,
		video.created_at,
		video.signature,
		row_number () over ( PARTITION BY signature ORDER BY created_at ) AS rn 
	FROM
		video 
	) tmp 
WHERE
	tmp.rn = 1

需求二:video(本地素材库)去重,且获取第二次上传时的id

不开窗的的方式:

???

开窗的方式:注意对比上个开窗的区别

SELECT
	* 
FROM
	(
	SELECT
		video.id,
		video.created_at,
		video.signature,
		row_number () over ( PARTITION BY signature ORDER BY created_at ) AS rn 
	FROM
		video 
	) tmp 
WHERE
	tmp.rn = 2
实战二:分段求和与累计求和
#累计求和
#id  时段 分段消耗 累计消耗
#1   0  10      10
#1   0  20      30
#1   0  30      60

#分段求和
select
 customerId,
 stat_hour,
 sum(costFormat) as total
from
 micro.etl_xm_campaign_charge_day_hour
where stat_date = "2021-11-30"  and customerId = 35702
group by customerId,stat_hour
order by stat_hour

#累计求和
select
 customerId,
 stat_hour,
 sum(costFormat) over(partition by customerId order by stat_hour rows between unbounded preceding and current row) as total
from
 (
 select
  customerId,
  stat_hour,
  sum(costFormat) as costFormat
 from
  micro.etl_xm_campaign_charge_day_hour
 where stat_date = "2021-11-30"  and customerId = 35702
 group by customerId,stat_hour   
)t
order by stat_hour
拓展——级联求和

级联集合:在同一个行中需要展示分段求和+累计求和

select
    tmp2.userId,
    tmp2.month,
    tmp2.total_month,
    sum(tmp2.total_month) over(partition by userId order by tmp2.month rows between unbounded preceding and current row)
from
    (select
        tmp1.userId,
        tmp1.month,
        sum(tmp1.visitCount) as total_month
    from
        (select
            userId,
            date_format(replace(visitDate,"/","-"),"yyyy-MM") as month,
            visitCount
        from
            visit
        )tmp1
    group by tmp1.userId,tmp1.month
    )tmp2
;

划重点:over()里面rows的范围

知识点——开窗函数分类
  1. 排名开窗函数
    • row_number:为每一组的行按顺序生成一个连续序号
    • dense_rank:为每一组的行按顺序生成一个连续序号,区别相同值相同序号,并且接下来序号连续。如:1,1,2。
    • rank:为每一组的行按顺序生成一个连续序号,区别相同值相同序号,并且接下来序号+1。如:1,1,3。
  2. 聚合开窗函数
    • sum、avg、max、min、count

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

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

相关文章

OJ# 376 机器翻译

题目描述 ​ 小李的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。 ​这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的…

简单易用多git服务器ssh密钥配置管理

文章目录 前言一、什么是ssh-key二、配置步骤添加ssh-key配置多ssh-key 总结 前言 快速理解如何配置管理多个git服务器的ssh,当我们有多个git帐号时会涉及如何管理不同的remote使用不同的git账户登陆推送 当前repo的origin remote是github,我们在推送时…

EMMC基础知识总结

1、说明 1.0 整体架构 ‘ EMMC最简单的可理解为带有控制器的FLASH,具体结构如下: EMMC: Embedded multiMediaCard EMMC. EMMC内部: host interface 、 flash controller 、 flash memory 1.1 flash memory 结构 EMMC 中一般…

学习Vue3——watchEffect(高级侦听器)

立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行。 watchEffect有两个参数 第一个参数就是要运行的副作用函数 第二个参数是一个可选的选项,可以用来调整副作用的刷新时机或调试副作用的依赖 API—watchEffect 基本用法 …

电脑必备,推荐几款好用的程序软件,让你工作更加高效

在当今的信息化时代,电脑已成为我们日常生活中必不可少的工具。而在电脑上安装一些好用的程序软件,能够大大提高我们的工作效率和体验。但是市面上的软件五花八门,要如何选择呢?下面将为大家推荐几款值得使用的程序软件&#xff0…

告别脚本小子系列丨JAVA安全(8)——反序列化利用链(下)

0x01 前言 在前面的文章中介绍了基于CC链的反序列化利用方式,并且通过最终调用Runtime类的exec方法达到命令执行的效果。在CC链中还可以通过xalan来执行命令。 xalan是java操作xml的库,属于java内置的官方库之一,在CC链中主要用到的是com.sun…

论文研读|TNNLS 期刊近三年对话生成工作介绍(2篇)

前言:本篇博客记录TNNLS期刊近三年的对话生成相关工作中本人比较感兴趣的两篇工作。首先给大家分享一下论文精确查找的方式,然后对两篇工作的主要思想进行简要介绍。 目录 1. 论文精确查找方法2. 论文简介2.1 面向用户个性保持与回复多样性的两阶段对话生…

错误:No module named ‘osgeo’

from osgeo import gdal 报错:No module named ‘osgeo’ pip install gdal 会出错,也不知道什么原因。 解决方案: 下载whl,然后pip install .whl即可。 详细步骤如下: whl下载地址:https://www.lfd.uci.edu/~go…

基于java+servlet+mysql-图书商城

基于javaservletmysql-图书商城 一、系统介绍二、功能展示1.项目骨架2.首页3.图书详情4.我的订单5.我的购物车6、注册7、登录8、图书管理9、订单管理 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型:Java web项目 项目名称:基于javaservlet…

浅谈企业能源监测管理系统的设计与应用

安科瑞 华楠 摘要: 针对企业目前能源监测现状, 结合企业信息化建设情况和发展需要, 介绍了能源监测管理信息系统, 提出了企业能源监测管理系统建设建议。 关键词:管理系统; 能源监测; 企业信息化 0 引言 节能降耗是缓解中国资源约束的根本出路, 也是提高企业自主创新能力的…

【机器学习】如何选择合适的假设函数

在前面的线性回归中,我们可以使用不同次数的多项式对数据集进行拟合,但是选择次数过低的多项式会导致欠拟合,选用次数过多的多项式会过拟合,那么如何选择合适的多项式呢?这就是本文需要解决的问题。 想要了解自己训练…

什么是α测试β测试和灰度测试?

吃软件测试这碗饭的,如果基础理论都不懂,谈何长久? 欢迎来学习本系列,基础理论比较枯燥,这也是为什么现在很少人掌握的主要原因。热饭尽量用浅显易懂 生动的例子 来帮助大家学习基础理论,所以请耐心看完此系…

纯JavaScript简单实现移动端网页的上拉加载、下拉刷新

公司要在安卓软件中,添加H5网页包,实现订单卡片列表,要求有上拉加载、下拉刷新的功能。 经过搜索资料后,实现如下: 创建一个类PullData class PullData() {/*** 类的构造函数,在new PullData({xx: xxx})时…

尚硅谷甄选--(暂时不更新,实习,后期有时间更)

文章目录 搭建后台管理系统模板项目的资源地址项目初始化2.1.1环境准备2.1.2初始化项目2.2项目配置一、eslint配置1.1vue3环境代码校验插件1.2修改.eslintrc.cjs配置文件1.3.eslintignore忽略文件1.4运行脚本 二、配置**prettier**2.1安装依赖包2.2.prettierrc.json添加规则2.3…

OpenCV——总结《车牌识别》

1.图片中的hsv hsv提取蓝色部分 # hsv提取蓝色部分 def hsv_color_find(img):img_copy img.copy()cv2.imshow(img_copy, img_copy)"""提取图中的蓝色部分 hsv范围可以自行优化cv2.inRange()参数介绍:第一个参数:hsv指的是原图第二个参…

阿里老员工吐槽:部门来了个“卷”王同事,我们都要跟着加班..

随着IT互联网热愈演愈烈,大批应届生选择毕业后进入IT圈,还有另一批打工人冲着高薪福利待遇转行IT行业,越来越多人涌入程序员大军中。加之互联网行业的火爆,催生了大量程序员岗位,门槛也较之前来说越来越低了&#xff0…

Python采集商品数据信息,看看一般怎样销量会多

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: python 3.8 >>>>>> 运行代码 pycharm 2022.3 >>>>>> 辅助敲代码 模块使用: selenium >>> pip install selenium3.141.0 指定版本安装 <模拟人的行为去操…

《论文阅读07》Segment Anything in 3D with NeRFs

一、论文 研究领域&#xff1a;图像分割(3D)论文&#xff1a;Segment Anything in 3D with NeRFsSubmitted on 24 Apr 2023 (v1), last revised 1 Jun 2023 (this version, v3)Computer Vision and Pattern Recognition (cs.CV)nvos数据集论文链接 二、论文概要 三、全文翻译 …

通用vs垂直?热门AI大模型你更看好哪个?(附免费资源)

自ChatGPT发布以来&#xff0c;通用大模型就仿佛坐了火箭&#xff0c;短短几个月的时间&#xff0c;各大企业便争相发布自己的大模型&#xff0c;这其实也反应了目前人工智能发展的方向。 不过从长远来看&#xff0c;垂直领域大模型的发展会比通用大模型更具势头&#xff0c;一…

Java线程面试题

0. Java线程面试题 0.1 线程占用的内存 JDK1.4默认单个线程占用256KJDK1.5默认单个线程占用1M可以通过-Xss参数设定 0.2 为什么要使用线程池 手动创建线程池的缺点 不受风险控制&#xff1a;服务器CPU资源有限&#xff0c;如果每个人都显示手动创建线程&#xff0c;不知道哪…