SQL - 开窗(窗口)函数

news2024/9/28 3:31:34

什么是开窗函数?

开窗函数对一组值进行操作,它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列

开窗函数的语法形式为:函数 + over(partition by <分组用列> order by <排序用列>),表示对数据集按照分组用列进行分区,并且并且对每个分区按照函数聚合计算,最终将计算结果按照排序用列排序后返回到该行。括号中的两个关键词partition by 和order by 可以只出现一个。

注意:开窗函数不会互相干扰,因此在同一个查询语句中可以同时使用多个开窗函数

开窗函数适用于 mysql 8.0以上版本, sql sever 、hive、oracle 等

测试数据

create table score (
    grade VARCHAR(10) not null,
    subject VARCHAR(10) not null,
    name VARCHAR(50) not null,
    score int not null
);

INSERT INTO score (grade, subject, name, score) VALUES ('Grade1', '语文', 'John', 90), 
('Grade2', '语文', 'Amy', 70), 
('Grade1', '语文', 'Mike', 80), 
('Grade2', '语文', 'Lisa', 80), 
('Grade2', '语文', 'Tom', 90),
('Grade1', '英语', 'John', 80), 
('Grade2', '英语', 'Amy', 90), 
('Grade1', '英语', 'Mike', 80), 
('Grade2', '英语', 'Lisa', 90), 
('Grade2', '英语', 'Tom', 100);

一、排序开窗函数

-- 一、排序开窗函数
-- ① row_number() -- 相同值排名连续,返回结果1、2、3、4
-- ② rank() -- 相同值排名相同,后续排名不连续,返回结果为 1、2、2、4
-- ③ dense_rank() -- 相同值排名相同,后续排名连续,返回结果为 1、2、2、3
-- ④ ntile(n) -- 分组排名,将数据分为n组并返回对应组号1、2......n
select grade
,subject
,score
-- ,row_number() over(partition by subject order by score desc) as row_numbers
-- ,rank() over(partition by subject order by score desc) as ranks
-- ,dense_rank() over(partition by subject order by score desc) as dense_ranks
,ntile(2) over(partition by subject order by score desc) as ntiles
from score;

1.1、row_number

,row_number() over(partition by subject order by score desc) as row_numbers

 1.2、rank

,rank() over(partition by subject order by score desc) as ranks

 1.3、dense_rank

,dense_rank() over(partition by subject order by score desc) as dense_ranks

 1.4、ntile

,ntile(2) over(partition by subject order by score desc) as ntiles

二、聚合开窗函数

-- 二、聚合开窗函数, 【有order by ,依不连续次序聚合;无order by 分组聚合】
-- ① sum() -- 分组求和
-- ② count() -- 分组求总数
-- ③ min() -- 分组求最小值
-- ④ max() -- 分组求最大值
-- ⑤ avg() --分组求均值
select grade
,subject
,score
-- ,sum(score) over(partition by subject) as sum聚合no_order_by
-- ,sum(score) over(partition by subject order by score desc) as sum聚合order_by
-- ,count(score) over(partition by subject) as count聚合no_order_by
-- ,count(score) over(partition by subject order by score desc) as count聚合order_by
-- ,min(score) over(partition by subject) as min聚合no_order_by
-- ,min(score) over(partition by subject order by score desc) as min聚合order_by
-- ,max(score) over(partition by subject) as max聚合no_order_by
-- ,max(score) over(partition by subject order by score desc) as max聚合order_by
-- ,avg(score) over(partition by subject) as avg聚合no_order_by
-- ,avg(score) over(partition by subject order by score desc) as avg聚合order_by
from score;

2.1、sum

2.1.1 不带order by

,sum(score) over(partition by subject) as sum聚合no_order_by

2.1.2 带有order by

,sum(score) over(partition by subject order by score desc) as sum聚合order_by

 

三、其他开窗函数

-- 三、其他开窗函数
-- ① lag(字段名,n,0) -- 落后移位开窗函数,表示返回向后第n行指定字段对应数据。其中n代表向后偏移n行,0代表若偏移行数超出表范围则返回0也可以改成其他值,若不写则默认null
-- ② lead(字段名,n,0) -- 超前移位开窗函数,与lag()相反,表示返回向前第n行指定字段对应数据
-- ③ first_value() -- 取分组后截止到当前行,排序后第一个值
-- ④ last_value() -- 取分组后截止到当前行,排序后最后一个值
-- 【oracle独有函数】⑤ ratio_to_report(字段名) over(partition by 字段名) -- 百分比分析函数,ratio_to_report(字段名) 为分子,over(partition by 字段名) 为分母,若分母中partition by 字段名 省略则表示占数据集整体百分比。为Oracle数据库函数,mysql不能使用
select grade
,subject
,score
-- ,lag(score,1,0) over(partition by subject order by score desc) as lag移位order_by
-- ,lag(score,1,0) over(partition by subject) as lag移位no_order_by
-- ,lead(score,1,0) over(partition by subject order by score desc) as lead移位order_by
-- ,lead(score,1,0) over(partition by subject) as lead移位no_order_by
-- ,first_value(score) over(partition by subject order by score asc) as first_value排序1
,last_value(score) over(partition by subject order by score asc) as last_value排序1
from score;

四、开窗函数的定位框架

-- 四、开窗函数的定位框架
-- 在order by 后存在可省略的窗口框架 range/rows between x and y ,主要用于对partition by的分组排序后结果做进一步限制,并定位出限制后的运算范围。
-- range表示按照值的排序范围进行范围的定义,而rows表示按照行的范围进行范围的定义。
-- 若order by 后未指定框架,那么默认框架将采用 range unbounded preceding and current row,表示按照值的排序范围进行范围的定义,从开窗后的第一行到当前行。
-- 若窗口函数没有order by,也就不存在框架range/rows between x and y。
-- 框架range/rows between x and y 具体x、y可取值见下表:
-- 		可取值								含义
-- unbounded preceding			partition by 分组order by后 第一行
-- unbounded following			partition by 分组order by后 最后一行
-- current row					partition by 分组order by后 当前行
-- n preceding					partition by 分组order by后 前n行
-- n following					partition by 分组order by后 后n行
-- 其中:range 只支持使用 unbounded preceding、 unbounded following、current row
select grade
,subject
,score
-- ,sum(score) over(partition by subject order by score desc) as sum聚合默认
-- ,sum(score) over(partition by subject order by score desc rows between unbounded preceding and current row) as sum聚合rows_preceding
-- ,sum(score) over(partition by subject order by score desc rows between current row and unbounded following) as sum聚合rows_preceding
-- ,sum(score) over(partition by subject order by score desc range between unbounded preceding and current row) as sum聚合range
-- ,sum(score) over(partition by subject order by score desc range between current row and unbounded following) as sum聚合range_following
-- ,sum(score) over(partition by subject order by score desc rows between 2 preceding and 1 following) as sum聚合2_1
,sum(score) over(partition by subject order by score desc range between 1 preceding and 1 following) as sum聚合range
from score;

参考:SQL函数 - 开窗(窗口)函数 - 知乎

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

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

相关文章

Vue2到3 Day7 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

【C语言】三子棋游戏——超细教学

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将结合之前的知识来实现 三子棋游戏。 目录&#xff1a; &#x1f31f;思路框架&#xff1a;测试游戏 &#x1f31f…

LangChain + Streamlit + Llama:将对话式AI引入本地机器

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 什么是LLMS&#xff1f; 大型语言模型 &#xff08;LLM&#xff09; 是指能够生成与人类语言非常相似的文本并以自然方式理解提示的机器学习模型。这些模型使用包括书籍、文章、网站和其他来源在内的…

PCIE 信息

PCIe&#xff08;外围组件互连快件&#xff09;是用于连接高速组件的接口标准。每台台式电脑主板有许多 PCIe 插槽&#xff0c;可用于添加通用显卡&#xff0c;各种外设卡&#xff0c;无线网卡或固态硬盘等等。PC 中可用的 PCIe 插槽类型将取决于你购买的主板. PCIe 插槽有不同…

无需公网IP——搭建web站点

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点将web站点发布到公网安装 Cpolar内网穿透cpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配…

9.4 多线程之线程池

线程池 进程已经能做到并发编程了 , 为什么还需要线程 ? 进程实在是太重量了 , 创建和销毁成本都比较高 , 需要申请释放资源 线程就是针对上述问题的优化 , 因为他是共用同一组系统资源的 , 一旦资源申请好了 , 后续就不需要再继续申请了 虽然线程已经很好了 , 不过在更高频…

浙大全日制英文MBA项目提面申请截至9月3日:几乎是上岸必经之路

今年浙大全日制MBA项目提前批面试做了改革&#xff0c;一年只设定一个批次申请&#xff0c;对于考生们来说其实是不太有利的&#xff0c;原因在于整个提面时间节奏会将部分考生逼到进退两难的境地&#xff0c;一方面无提面的状态下全日制MBA项目都知道需要比较高的分数才可能够…

计算机竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

GC的前置工作,聊聊GC是如何快速枚举根节点的

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 什么是根节点枚举根节点枚举存在的问题如何解决根节点枚举的问题安全点安全区域 上篇文章中我们留下了个坑&#xff1a;「 根节点枚举」…

计网第三章(数据链路层)(四)

目录 一、MAC地址和IP地址以及ARP协议 1.MAC地址&#xff1a; 单播MAC地址&#xff1a; 广播MAC地址&#xff1a; 多播MAC地址&#xff1a; 2.IP地址&#xff1a; 3.IP地址和MAC地址&#xff1a; 1.什么情况下使用&#xff1f; 2.IP地址和MAC地址填写位置&#xff1f;…

保障用户观影体验 极米推出首款搭载超级混光技术投影仪极米RS Pro 3

随着投影市场的日渐蓬勃&#xff0c;倒推了投影技术的研发创新&#xff0c;投影仪产品在最近几年已经逐步进入到家庭空间&#xff0c;成为很多家庭不可或缺的家电产品&#xff0c;不论是客厅还是卧室&#xff0c;或者是户外露营等&#xff0c;投影仪的家用场景已经拓展到了人们…

ps2024后期调色滤镜插件使用教程图解

Exposure是一款常见的ps调色滤镜插件&#xff0c;相信许多朋友都曾经用过它。一个优秀的摄像师不仅需要懂得摄像技巧&#xff0c;还要掌握图像的后期调色窍门。那么&#xff0c;后期调色软件哪个好&#xff0c;后期调色教程图解&#xff0c;接下来一起来了解一下吧。 一、后期…

为何Ping不通啊?

为什么Ping不通啊&#xff01;求指点&#xff1f; 友情提醒&#xff0c;这个问题难度系数初级难度&#xff08;CCNA&#xff09;&#xff0c;只适合初级读者阅读&#xff0c;避免浪费宝贵时间。 Q1: 为何PC1能Ping通PC2&#xff1f;或反之亦然&#xff1f; PC1主观认为PC2和自…

YOLO目标检测——血管瘤数据集下载分享

血管瘤数据集在医学领域的研究和临床应用中起着重要的作用。它可以用于开发和评估血管瘤检测和分割算法&#xff0c;帮助医生准确地定位和诊断血管瘤。此外&#xff0c;血管瘤数据集还可以用于研究血管瘤的生长规律、预测血管瘤的发展趋势等。 数据集点击下载&#xff1a;血管瘤…

云windows iis部署vue前端项目 步骤

工作记录 第一步 先进行vue项目打包 npm run build打包后会产生一个dist文件 然后将前端全部文件传到想要部署的windows上 这个一步直接远程连接 复制粘贴就可以 第二步 打开iis 添加网络 网站名称输入你想要用的二级域名 &#xff08;需要到**云上报备下 我这个用的是阿里…

自动化测试工具Selenium的语法续.

OK&#xff0c;那么上篇博客我们介绍了如何搭建基于Javaselenium的环境&#xff0c;并且使用selenium的一些语法给大家演示了如何进行自动化测试的案例&#xff0c;那么本篇博客我们来继续学习selenium的一些其他的比较重要的语法&#xff0c;感谢关注&#xff0c;期待三连~ 目…

快速学会创建uni-app项目并了解pages.json文件

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 前言 创建 uni-app 项目 通过 HBuilderX 创建 pages.json pages style globalStyle tabBar 前言…

从零做软件开发项目系列之二——需求调研

在接到软件开发任务之后&#xff0c;第一件要做的事情就是进行需求调研工作&#xff0c;基于前期的沟通以及合同向用户了解具体需求&#xff0c;从而有针对性地开展后续工作。整个调研过程分为调研准备&#xff0c;调研实施&#xff0c;需求分析。 1 调研准备 俗话说&#x…

基于微信小程序的宠物领养平台的设计与实现(Java+spring boot+微信小程序+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的宠物领养平台的设计与实现&#xff08;Javaspring boot微信小程序MySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java…

【工程实践】使用pandas的记录

前言 工作中处理数据时&#xff0c;经常需要使用pandas&#xff0c;记录一些工作中使用pandas的习惯。 1. 合并数据 #读取原始数据 data1 pd.read_excel(/home/zhenhengdong/WORk/Classfier/Dates/Original/1.xlsx) data2 pd.read_excel(/home/zhenhengdong/WORk/Classfier/…