当前位置: 首页 > news >正文

mysql学习教程,从入门到精通,SQL窗口函数(38)

1、SQL窗口函数

SQL窗口函数(Window Functions)是一种强大的数据分析工具,它们允许你在结果集的行上执行计算,而不需要将这些行分组到单独的输出行中。窗口函数通常与OVER()子句一起使用,该子句定义了窗口或分区,以及窗口内的排序规则。以下是SQL窗口函数的一般语法:

<window_function>() OVER ([PARTITION BY <partition_expression>, ...][ORDER BY <order_expression> [ASC|DESC], ...][ROWS or RANGE <frame_clause>]
)
  • <window_function>():这是你要应用的窗口函数,如ROW_NUMBER()RANK()DENSE_RANK()SUM()AVG()MIN()MAX()等。注意,虽然SUM()AVG()MIN()MAX()通常是聚合函数,但当它们与OVER()子句一起使用时,它们就变成了窗口函数。

  • OVER():这个子句定义了窗口函数的操作范围。

  • PARTITION BY <partition_expression>:可选。这个子句将结果集划分为分区,窗口函数将在每个分区内独立计算。如果没有PARTITION BY,则整个结果集被视为一个单一的分区。

  • ORDER BY <order_expression>:通常必需(但某些窗口函数可能不需要)。这个子句定义了窗口内行的排序顺序。这对于计算如排名或累计和等窗口函数是必需的。

  • ROWS or RANGE <frame_clause>:可选。这个子句定义了窗口帧(frame),即窗口函数将考虑的行集。ROWS基于物理行数,而RANGE基于值的范围。常见的帧子句包括ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(从分区开始到当前行)和RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(基于值的范围,但具体行为可能因数据库而异)。

以下是一些常见的窗口函数及其用途:

  • ROW_NUMBER():为窗口内的每一行分配一个唯一的序号。
  • RANK():为窗口内的行分配排名,跳过相同的值并留下空位。
  • DENSE_RANK():为窗口内的行分配排名,不跳过相同的值。
  • SUM()AVG()MIN()MAX():计算窗口内行的总和、平均值、最小值和最大值。

例如,以下查询使用ROW_NUMBER()窗口函数为按销售额排序的每个销售人员的销售记录分配一个序号:

SELECTsalesperson_id,sale_date,amount,ROW_NUMBER() OVER (PARTITION BY salesperson_id ORDER BY sale_date) AS sale_rank
FROMsales;

在这个查询中,ROW_NUMBER()函数在salesperson_id分区内按sale_date排序为每行分配一个序号(sale_rank)。

窗口函数(Window Functions)是SQL中的一种强大工具,用于在查询结果集的行上执行计算,而不需要将结果集分组为单独的输出行。这些函数通常用于执行诸如排名、累计总和、移动平均等操作。

以下是一个示例,展示如何使用窗口函数来计算每个员工在部门内的工资排名和累计工资总和。

假设我们有一个名为 employees 的表,结构如下:

CREATE TABLE employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(100),department_id INT,salary DECIMAL(10, 2)
);

并且表中有以下数据:

INSERT INTO employees (employee_id, employee_name, department_id, salary) VALUES
(1, 'Alice', 1, 70000),
(2, 'Bob', 1, 50000),
(3, 'Charlie', 1, 60000),
(4, 'David', 2, 80000),
(5, 'Eve', 2, 90000),
(6, 'Frank', 2, 75000);

现在,我们希望计算每个员工在其部门内的工资排名(按降序排列)和累计工资总和。

可以使用以下SQL查询:

SELECTemployee_id,employee_name,department_id,salary,RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank,SUM(salary) OVER (PARTITION BY department_id ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_salary
FROMemployees;

解释:

  1. RANK() OVER (PARTITION BY department_id ORDER BY salary DESC):

    • RANK() 是窗口函数之一,用于计算排名。
    • PARTITION BY department_id 表示将结果集按部门分区。
    • ORDER BY salary DESC 表示在每个分区内按工资降序排列。
    • 结果是每个员工在其部门内的工资排名。
  2. SUM(salary) OVER (PARTITION BY department_id ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW):

    • SUM() 是聚合函数之一,但在这里用作窗口函数。
    • PARTITION BY department_id 同样表示将结果集按部门分区。
    • ORDER BY salary DESC 表示在每个分区内按工资降序排列。
    • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 表示累计从分区开始到当前行的所有行的工资总和。
    • 结果是每个员工在其部门内的累计工资总和。

运行上述查询后,结果将如下所示:

employee_id | employee_name | department_id | salary | salary_rank | cumulative_salary
------------|---------------|---------------|--------|-------------|-------------------
4           | David         | 2             | 80000  | 1           | 80000
5           | Eve           | 2             | 90000  | 2           | 170000
6           | Frank         | 2             | 75000  | 3           | 245000
1           | Alice         | 1             | 70000  | 1           | 70000
3           | Charlie       | 1             | 60000  | 2           | 130000
2           | Bob           | 1             | 50000  | 3           | 180000

这样,我们就成功地使用了窗口函数来计算每个员工在其部门内的工资排名和累计工资总和。

当然可以。以下是一些使用SQL窗口函数的实际案例,这些案例展示了窗口函数在不同场景下的应用。

案例一:累计销售额计算

假设有一个销售数据表 sales,包含以下字段:date(日期)、amount(销售额)。我们需要计算到当前日期为止的累计销售额。

SELECTdate,amount,SUM(amount) OVER (ORDER BY date) AS cumulative_total
FROMsales;

在这个查询中,SUM(amount) OVER (ORDER BY date) 是一个窗口函数,它按照日期的顺序对销售额进行累计求和。结果集将包含每一天的销售额以及到该天为止的累计销售额。

案例二:部门内工资排名

考虑一个员工表 employees,包含以下字段:employee_id(员工ID)、name(姓名)、department_id(部门ID)、salary(工资)。我们希望计算每个员工在其部门内的工资排名。

SELECTemployee_id,name,department_id,salary,RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS salary_rank
FROMemployees;

在这个查询中,RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) 是一个窗口函数,它首先按部门对员工进行分区,然后在每个分区内按工资降序排列,并计算排名。结果集将包含每个员工的ID、姓名、部门ID、工资以及在其部门内的工资排名。

案例三:累计计数

假设我们想要计算到当前日期为止的累计销售次数,可以使用 COUNT() 窗口函数。

SELECTdate,COUNT(*) OVER (ORDER BY date) AS cumulative_count
FROMsales;

这个查询将返回每一天的日期以及到该天为止的累计销售次数。

案例四:获取前一行和后一行的数据

有时候,我们需要获取当前行前一行或后一行的数据。这可以使用 LAG()LEAD() 窗口函数来实现。

SELECTemployee_id,salary,LAG(salary, 1) OVER (ORDER BY salary) AS previous_salary,LEAD(salary, 1) OVER (ORDER BY salary) AS next_salary
FROMemployees;

在这个查询中,LAG(salary, 1) OVER (ORDER BY salary) 返回当前行前一行的工资,而 LEAD(salary, 1) OVER (ORDER BY salary) 返回当前行后一行的工资。结果集将包含每个员工的ID、工资以及前一行和后一行的工资。

案例五:分组内的累计平均值

假设我们有一个表 student_scores,包含以下字段:student_id(学生ID)、course_id(课程ID)、score(成绩)。我们希望计算每个学生在每门课程内的累计平均成绩。

SELECTstudent_id,course_id,score,AVG(score) OVER (PARTITION BY student_id, course_id ORDER BY score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_average
FROMstudent_scores;

在这个查询中,AVG(score) OVER (PARTITION BY student_id, course_id ORDER BY score ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 是一个窗口函数,它首先按学生和课程进行分区,然后在每个分区内按成绩顺序计算累计平均成绩。结果集将包含每个学生的ID、课程ID、成绩以及在该课程内的累计平均成绩。
这些案例展示了窗口函数在SQL中的广泛应用,它们可以极大地简化复杂的数据分析任务。

相关文章:

mysql学习教程,从入门到精通,SQL窗口函数(38)

1、SQL窗口函数 SQL窗口函数&#xff08;Window Functions&#xff09;是一种强大的数据分析工具&#xff0c;它们允许你在结果集的行上执行计算&#xff0c;而不需要将这些行分组到单独的输出行中。窗口函数通常与OVER()子句一起使用&#xff0c;该子句定义了窗口或分区&…...

gbase8s数据库实现黑白名单的几种方案

1、借用操作系统的黑白名单 2、使用数据库 TRUSTED CONTEXT 机制 CREATE TRUSTED CONTEXT tcx1USER rootATTRIBUTES (ADDRESS 172.16.39.162)ATTRIBUTES (ADDRESS 172.16.39.163)ENABLEWITH USE FOR wangyx WITHOUT AUTHENTICATION; 如上创建 可信任上下文对象 tcx1 在 jdb…...

Qt-窗口布局按钮输入类

1. 窗口布局 Qt 提供了很多摆放控件的辅助工具&#xff08;又称布局管理器或者布局控件&#xff09;&#xff0c;它们可以完成两件事&#xff1a; 自动调整控件的位置&#xff0c;包括控件之间的间距、对齐等&#xff1b; 当用户调整窗口大小时&#xff0c;位于布局管理器内的…...

Apache DolphinScheduler社区9月进展记录

各位热爱 Apache DolphinScheduler 的小伙伴们&#xff0c;社区 9 月月报更新啦&#xff01;这里将记录 Apache DolphinScheduler 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 月度 Merge Star 感谢以下小伙伴上个月为 Apache DolphinScheduler 做的精彩贡献&#x…...

在docker中安装并运行mysql8.0.31

第一步&#xff1a;命令行拉取mysql镜像 docker pull mysql:8.0.31查看是否拉取成功 docker images mysql:latest第二步&#xff1a;运行mysql镜像&#xff0c;启动mysql实例 docker run -p 3307:3307 -e MYSQL_ROOT_PASSWORD"123456" -d mysql:8.0.313307:3307前…...

C++ | Leetcode C++题解之第458题可怜的小猪

题目&#xff1a; 题解&#xff1a; class Solution { public:int poorPigs(int buckets, int minutesToDie, int minutesToTest) {if (buckets 1) {return 0;}vector<vector<int>> combinations(buckets 1,vector<int>(buckets 1));combinations[0][0] …...

【万字长文】Word2Vec计算详解(三)分层Softmax与负采样

【万字长文】Word2Vec计算详解&#xff08;三&#xff09;分层Softmax与负采样 写在前面 第三部分介绍Word2Vec模型的两种优化方案。 【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解&#xff08;二&#xff0…...

【分布式微服务云原生】探索Dubbo:接口定义语言的多样性与选择

目录 探索Dubbo&#xff1a;接口定义语言的多样性与选择引言Dubbo的接口定义语言&#xff08;IDL&#xff09;1. Java接口2. XML配置3. 注解4. Protobuf IDL 流程图&#xff1a;Dubbo服务定义流程表格&#xff1a;Dubbo IDL方式比较结论呼吁行动Excel表格&#xff1a;Dubbo IDL…...

SAP将假脱机(Spool requests)内容转换为PDF文档[RSTXPDFT4]

将假脱机(Spool requests)内容转换为PDF文档[RSTXPDFT4] 有时需要将Spool中的内容导出成PDF文件&#xff0c;sap提供了一个标准程序RSTXPDFT4可以实现此功能。 1, Tcode:SP01, 进入spool requests list 2, SE38 运行程序RSTXPDFT4 输入spool reqeust号码18680&#xff0c;然后…...

DNS能加速游戏吗?

在游戏玩家追求极致游戏体验的今天&#xff0c;任何可能提升游戏性能的因素都备受关注&#xff0c;DNS&#xff08;域名系统&#xff09;便是其中一个被探讨的对象。那么&#xff0c;DNS能加速游戏吗&#xff1f; 首先&#xff0c;我们需要了解DNS的基本功能。DNS就像是互联网…...

Raspberry Pi3B+之C/C++开发环境搭建

Raspberry Pi3B之C/C开发环境搭建 1. 源由2. 环境搭建2.1 搭建C语言开发环境2.2 工程目录结构2.3 Makefile2.4 Demo (main.c) 3. 测试工程3.1 编译3.2 运行 4. 总结5. 参考资料 1. 源由 为了配合《Ardupilot开源飞控之FollowMe验证平台搭建》&#xff0c;以及VINS-Fusion对于图…...

[笔记] 仿射变换性质的代数证明

Title: [笔记] 仿射变换性质的代数证明 文章目录 I. 仿射变换的代数表示II. 仿射变换的性质III. 同素性的代数证明1. 点变换为点2. 直线变换为直线 IV. 结合性的代数证明1. 直线上一点映射为直线上一点2. 直线外一点映射为直线外一点 V. 保持单比的代数证明VI. 平行性的代数证明…...

遥感影像-语义分割数据集:sar水体数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该数据集由WHU-OPT-SAR数据集整理而来&#xff0c;覆盖面积51448.56公里&#xff0c;分辨率为5米。据我们所知&#xff0c;WHU-OPT-SAR是第一个也是最大的土地利用分类数据集&#xff0c;它融合了高分辨率光学和SAR图像&#xff0c;并进行了充…...

极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

汽车管理系统中使用函数

目录 setupUisetEnabledcurrentText()setTextsetFocus()query.exec(...)addWidgetconnect setupUi setupUi() 是 ui 对象的一个成员函数&#xff0c;它的作用是根据 .ui 文件中的设计&#xff0c;将设计好的组件&#xff08;如按钮、文本框、布局等&#xff09;添加到当前的窗…...

大数据分析入门概述

大数据分析入门概述 本文旨在为有意向学习数据分析、数据开发等大数据方向的初学者提供一个学习指南&#xff0c;当然如果你希望通过视频课程的方式快速入门&#xff0c;B站UP主戴戴戴师兄的课程质量很高&#xff0c;并且适合初学者快速入门。本文的目的旨在为想要了解大数据但…...

提示工程、微调和 RAG

自众多大型语言模型&#xff08;LLM&#xff09;和高级对话模型发布以来&#xff0c;人们已经运用了各种技术来从这些 AI 系统中提取所需的输出。其中一些方法会改变模型的行为来更好地贴近我们的期望&#xff0c;而另一些方法则侧重于增强我们查询 LLM 的方式&#xff0c;以提…...

自动化测试中如何高效进行元素定位!

前言 在自动化测试中&#xff0c;元素定位是一项非常重要的工作。良好的元素定位可以帮助测试人员处理大量的测试用例&#xff0c;加快测试进度&#xff0c;降低工作负担。但是在实际的测试工作中&#xff0c;我们常常遇到各种各样的定位问题&#xff0c;比如元素定位失败、元…...

UE5数字人制作平台使用及3D模型生成

第10章 数字人制作平台使用及3D模型生成 在数字娱乐、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域&#xff0c;高质量的3D模型是数字内容创作的核心。本章将引导你了解如何使用UE5&#xff08;Unreal Engine 5&#xff09;虚幻引擎这一强大…...

Linux进程被占用如何杀死进程

文章目录 前言一、根据名称进行查找程序所占用的端口号二、杀死进程总结 前言 由于Linux中&#xff0c;校园网登录的时候容易出现端口被占用&#xff0c;如何快速查找程序所占用的端口号。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、根据名称…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...