SQL窗口函数详解
详细说明在sql中窗口函数是什么,为什么需要窗口函数,有普通的聚合函数了那窗口函数的意义在哪,窗口函数的执行逻辑是什么,over中的字句是如何使用和理解的(是不是句句戳到你的痛点,哼哼~)
1.什么是窗口函数?
窗口函数(Window Functions)是SQL中的一种功能强大的工具,用于对查询结果集中的每一行进行计算,而无需对数据进行分组(GROUP BY)。与聚合函数不同,窗口函数不会将行汇总到一条记录中,而是保留原始行,并在此基础上添加计算结果。窗口函数常用于排名、累积和、滑动窗口计算等。
2.为什么需要窗口函数(为什么普通的聚合函数不行)
2.1四点原因
按行计算而不改变行的结构:
• 窗口函数能够在不改变行结构的情况下对数据进行计算。与聚合函数(如SUM、AVG等)不同,窗口函数不会将多行数据聚合成一行,而是对每一行进行计算并返回结果,同时保留原始行。这在许多分析场景中非常有用,例如累积和、排名计算等。
支持复杂的分析计算:
• 窗口函数可以进行复杂的分析计算,包括排名、累积和、滑动平均等。这些计算在财务分析、时间序列分析和数据挖掘中非常常见。例如,使用窗口函数可以计算每个销售员的销售排名、某产品在不同时间段的累积销售量等。
灵活的分区和排序机制:
• 窗口函数支持按分区和排序进行计算,提供了极大的灵活性。可以根据需要按特定列进行分区(PARTITION BY),并在每个分区内按某列排序(ORDER BY)。这使得可以在多个维度上进行复杂的数据分析。例如,可以按客户ID和时间进行分区和排序,从而分析每个客户在不同时间段的行为变化。
保持数据的上下文关系:
• 窗口函数能够保持数据的上下文关系。在进行累积计算或滑动窗口计算时,窗口函数能够在当前行的基础上考虑前后多行的数据。这在时间序列分析中尤为重要,例如计算滚动平均值、滚动总和等。
提高查询的可读性和维护性:
• 使用窗口函数可以使SQL查询更加简洁和可读。相比于嵌套的子查询或复杂的JOIN操作,窗口函数提供了一种更直观的方式来表达复杂的计算逻辑。这不仅提高了查询的可读性,还降低了维护的难度。
2.2举几个例子
例子1:计算每篇文章在每个时间点的累积观看人数
SELECT artical_id,dt,SUM(diff) OVER (PARTITION BY artical_id ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_viewers
FROM combined
ORDER BY artical_id, dt;
在这个例子当中,窗口函数可以很方便的选择包括当前行在内的其以前的所有行
例2:计算每个销售员的销售额排名
SELECT salesperson,sales,RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS sales_rank
FROM sales_data;
在这个例子当中,使用窗口函数做一个“开窗”,类似单独拖出一个小窗口,在这个小窗口中选定一个标准对销售员进行排序,在这个小窗口中,每一行数据都得到了自己的排名,然后带着这个排名回到主查询中;这个过程中,主查询既没有使用group by分组,也没有order by来产生排名,也没有使用子查询,但是每一个销售员却得到了自己地区中的排名,这就是刚刚提到的对每一行进行计算并返回结果,同时保留原始行。
3.窗口函数的执行逻辑是什么(over怎么用)
只有了解了窗口函数的执行逻辑才能在复杂的查询中正确运用窗口函数
3.1 生成基础结果集
首先,SQL引擎会执行查询语句中的FROM子句、WHERE子句、GROUP BY子句和HAVING子句,生成基础结果集。这个结果集包含了所有符合条件的数据。所以窗口函数会在拿到所在主查询的基础结果集后才生效!
3.2 分区(Partitioning)
在执行窗口函数时,OVER子句中的PARTITION BY子句会将基础结果集划分为多个分区。每个分区独立处理,窗口函数将在每个分区内单独执行。如果没有指定PARTITION BY,则视为一个整体分区。注意这个分区是在窗口内单独做的,并没有对主查询中的结果或者说每一行产生影响。
3.3 排序(Ordering)
在每个分区内,根据OVER子句中的ORDER BY子句进行排序。排序定义了窗口函数的计算顺序,确保计算按指定的顺序进行。注意这个排序也是在窗口内单独做的,并没有对主查询中的结果或者说每一行产生影响。
3.4 定义窗口帧(Frame)
窗口帧定义了窗口函数计算的行范围。窗口帧由ROWS或RANGE子句指定。
从2、3中,不难看出,这有一个易混淆的点(也是本人混淆过的点),那就是over中的分区和排序 本质上 是在定义窗口函数的计算方式,和主查询中的group by和order by(如果有的话)并无关系!!!!!
3.5 举个例子
这个例子是在一个uid-用户ID, artical_id-文章ID, in_time-进入时间, out_time-离开时间组成的表的基础上,统计每篇文章同一时刻最大在看人数
SELECTartical_id,MAX(instant_viewer_cnt) max_uv
FROM (SELECTartical_id,dt,SUM(diff) OVER(PARTITION BY artical_id ORDER BY dt, diff DESC) instant_viewer_cntFROM (SELECT artical_id, in_time dt, 1 diffFROM tb_user_logWHERE artical_id != 0UNION ALLSELECT artical_id, out_time dt, -1 diffFROM tb_user_logWHERE artical_id != 0) t1 group byartical_id,dt
) t2
GROUP BY 1
ORDER BY 2 DESC
这里t1表是通过编码操作和union操作生成的瞬时动作表,我们为了从t1的瞬时动作得到每个时刻的状态表t2,所以需要窗口函数来做聚合,窗口函数中的order by只是定义sum的计算方式,如果要想主查询中也是按照artical_id和dt的顺序来呈现结果那么,是需要显式地在真正的order by中写出来的
相关文章:
SQL窗口函数详解
详细说明在sql中窗口函数是什么,为什么需要窗口函数,有普通的聚合函数了那窗口函数的意义在哪,窗口函数的执行逻辑是什么,over中的字句是如何使用和理解的(是不是句句戳到你的痛点,哼哼~&#x…...
如何用Java写一个整理Java方法调用关系网络的程序
大家好,我是猿码叔叔,一位 Java 语言工作者,也是一位算法学习刚入门的小学生。很久没有为大家带来干货了。 最近遇到了一个问题,大致是这样的:如果给你一个 java 方法,如何找到有哪些菜单在使用。我的第一想…...
基于STM32设计的管道有害气体检测装置(ESP8266局域网)176
基于STM32设计的管道有害气体检测装置(176) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成【3】ESP8266模块配置【4】上位机开发思路【5】项目模块划分【6】LCD显示屏界面布局【7】上位机界面布局1.2 项目功能需求1.3 项目开发背景1.4 开发工具的选择1…...
iCloud照片库全指南:云端存储与智能管理
iCloud照片库全指南:云端存储与智能管理 在数字化时代,照片和视频成为了我们生活中不可或缺的一部分。随着手机摄像头质量的提升,我们记录生活点滴的方式也越来越丰富。然而,这也带来了一个问题:如何有效管理和存储日…...
IDEA中使用Maven打包及碰到的问题
1. 项目打包 IDEA中,maven打包的方式有两种,分别是 install 和 package ,他们的区别如下: install 方式 install 打包时做了两件事,① 将项目打包成 jar 或者 war,打包结果存放在项目的 target 目录下。…...
TreeMap、HashMap 和 LinkedHashMap 的区别
TreeMap、HashMap 和 LinkedHashMap 的区别 1、HashMap2、LinkedHashMap3、TreeMap4、总结 💖The Begin💖点点关注,收藏不迷路💖 在 Java 中,TreeMap、HashMap 和 LinkedHashMap 是三种常用的集合类,它们在…...
【跟我学K8S】45天入门到熟练详细学习计划
目录 一、什么是K8S 核心功能 架构组件 使用场景 二、入门到熟练的学习计划 第一周:K8s基础和概念 第二周:核心对象和网络 第三周:进阶使用和管理 第四周:CI/CD集成和监控 第五周:实战模拟和案例分析 第六周…...
ubuntu下载Nginx
一、Nginx下载安装(Ubuntu系统) 1.nginx下载 sudo apt-get install nginx2.nginx启动 启动命令 sudo nginx重新编译(每次更改完nginx配置文件后运行): sudo nginx -s reload3.测试nginx是否启动成功 打开浏览器访问本机80端口…...
【区分vue2和vue3下的element UI Dialog 对话框组件,分别详细介绍属性,事件,方法如何使用,并举例】
在 Vue 2 和 Vue 3 中,Element UI(针对 Vue 2)和 Element Plus(针对 Vue 3)提供了 Dialog 对话框组件,用于在页面中显示模态对话框。这两个库中的 Dialog 组件在属性、事件和方法的使用上有所相似ÿ…...
docker push 推送镜像到阿里云仓库
1.登陆阿里云 镜像服务,跟着指引操作就行 创建个人实例,创建命名空间、镜像仓库,绑定代码源头 2.将镜像推送到Registry $ docker login --username*** registry.cn-beijing.aliyuncs.com $ docker tag [ImageId] registry.cn-beijing.aliy…...
伯克利、斯坦福和CMU面向具身智能端到端操作联合发布开源通用机器人Policy,可支持多种机器人执行多种任务
不同于LLM或者MLLM那样用于上百亿甚至上千亿参数量的大模型,具身智能端到端大模型并不追求参数规模上的大,而是指其能吸收大量的数据,执行多种任务,并能具备一定的泛化能力,如笔者前博客里的RT1。目前该领域一个前沿工…...
昇思25天学习打卡营第17天(+1)|Diffusion扩散模型
1. 学习内容复盘 本文基于Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件,执行Python文件时,请确…...
【Leetcode笔记】406.根据身高重建队列
文章目录 1. 题目要求2.解题思路 注意3.ACM模式代码 1. 题目要求 2.解题思路 首先,按照每个人的身高属性(即people[i][0])来排队,顺序是从大到小降序排列,如果遇到同身高的,按照另一个属性(即p…...
Linux 安装pdfjam (PDF文件尺寸调整)
跟Ghostscript搭配使用,这样就可以将不同尺寸的PDF调整到相同尺寸合并了。 在 CentOS 上安装 pdfjam 需要安装 TeX Live,因为 pdfjam 是基于 TeX Live 的。以下是详细的步骤来安装 pdfjam: ### 步骤 1: 安装 EPEL 仓库 首先,安…...
python+playwright 学习-90 and_ 和 or_ 定位
前言 playwright 从v1.34 版本以后支持and_ 和 or_ 定位 XPath 中的and和or xpath 语法中我们常用的有text()、contains() 、ends_with()、starts_with() //*[text()="文本"] //*[contains(@id, "xx")] //...
亲子时光里的打脸高手,贾乃亮与甜馨的父爱如山
贾乃亮这波操作,简直是“实力打脸”界的MVP啊! 7月5号,他一甩手,甩出张合照, 瞬间让多少猜测纷飞的小伙伴直呼:“脸疼不?”带着咱家小甜心甜馨, 回了哈尔滨老家,这趟亲…...
MySQL篇-SQL优化实战
SQL优化措施 通过我们日常开发的经验可以整理出以下高效SQL的守则 表主键使用自增长bigint加适当的表索引,需要强关联字段建表时就加好索引,常见的有更新时间,单号等字段减少子查询,能用表关联的方式就不用子查询,可…...
【MySQL备份】Percona XtraBackup总结篇
目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…...
【Git 】规范 Git 提交信息的工具 Commitizen
Commitizen是一个用于规范Git提交信息的工具,它旨在帮助开发者生成符合一定规范和风格的提交信息,从而提高代码维护的效率,便于追踪和定位问题。以下是对Commitizen的详细介绍。 1、Commitizen的作用与优势 规范提交信息:通过提供…...
ABB PPC902AE1013BHE010751R0101控制器 处理器 模块
ABB PPC902AE1013BHE010751R0101 该模块是用于自动化和控制系统的高性能可编程控制器。它旨在与其他自动化和控制设备一起使用,以提供完整的系统解决方案 是一种数字输入/输出模块,提供了高水平的性能和可靠性。它专为苛刻的工业应用而设计,…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
