百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

你还不知道什么是MySQL窗口函数?(mysql窗口函数的作用)

yuyutoo 2025-05-08 22:04 10 浏览 0 评论

MySQL中的窗口函数是一类用来在某一部分查询结果上进行计算的函数,这些函数的用法与普通的聚合函数如 SUM、AVG、COUNT类似,但是与聚合函数不同的是,窗口函数不会讲多行数据合并成一行结果,而是可以保留每一行的数据,并且同时在一组数据也就是一个窗口上进行计算。

在使用过程中通常需要通过OVER 子句来定义数据分组和排序规则,如下所示,是窗口函数的一些特点

  • 保留行:根据上面的介绍我们知道在窗口函数对行进行计算的时候,可以将所有的计算结果中的每一行数据都会保留在结果集中。
  • 定义窗口:定义窗口函数的时候,需要通过OVER 子句来进行定义,也就是指定分区和排序规则。
  • 支持多种函数:窗口函数包括聚合函数、排名函数、分布函数和统计函数。

常见的窗口函数

  • 聚合窗口函数:如 SUM(), AVG(), COUNT(), MAX(), MIN() 等。
  • 排名函数:
    • ROW_NUMBER():返回分区中的行号,按排序规则排序。
    • RANK():返回分区中的排名,排名有重复时会跳过排名。
    • DENSE_RANK():返回分区中的排名,排名有重复时不会跳过排名。
    • NTILE(N):将分区中的行按排序规则分成N份,返回每行所属的组号。
  • 偏移函数:
    • LAG(expression, offset, default):返回当前行前面第 offset 行的 expression 值。
    • LEAD(expression, offset, default):返回当前行后面第 offset 行的 expression 值。
  • 累计函数:
    • FIRST_VALUE(expression):返回当前窗口的第一个值。
    • LAST_VALUE(expression):返回当前窗口的最后一个值。
    • NTH_VALUE(expression, N):返回当前窗口的第 N 个值。

使用MySQL窗口函数进行查询的时候,可以在窗口函数中进行各种复杂的计算,而这种复杂的计算不会合并成一行,也就是不会丢失行数据,下面我们就通过几个例子来看看如何使用不同的窗口函数来进行操作。如下所示。

ROW_NUMBER() 排名函数

假设有一个包含学生成绩的students_scores分数表,如果我们想要根据成绩排名,我们可以通过如下的方式来进行操作。

CREATE TABLE students_scores (
    student_id INT,
    student_name VARCHAR(50),
    score INT
);

INSERT INTO students_scores (student_id, student_name, score) VALUES
(1, 'Alice', 85),
(2, 'Bob', 92),
(3, 'Charlie', 85),
(4, 'David', 91);

SELECT
    student_id,
    student_name,
    score,
    ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
FROM
    students_scores;

上面的结果就可以按照成绩进行排名

RANK() 排名函数

当然,除了使用上面的这种方式,在students_scores表中,我们还可以使用RANK()函数来对学生的成绩进行排名,这种情况下分数相同的时候也会进行排名

SELECT
    student_id,
    student_name,
    score,
    RANK() OVER (ORDER BY score DESC) AS rank
FROM
    students_scores;

SUM() 聚合窗口函数

假设我们有一张销售记录表sales,其中包含了销售人员的各项销售信息,如果我们想要计算每个销售人员的累计销售额,我们可以通过如下的方式来进行操作。

CREATE TABLE sales (
    sale_id INT,
    salesperson_id INT,
    sale_date DATE,
    amount DECIMAL(10, 2)
);

INSERT INTO sales (sale_id, salesperson_id, sale_date, amount) VALUES
(1, 1, '2024-01-01', 100.00),
(2, 1, '2024-01-05', 200.00),
(3, 2, '2024-01-02', 150.00),
(4, 1, '2024-01-10', 50.00),
(5, 2, '2024-01-07', 300.00);

SELECT
    salesperson_id,
    sale_date,
    amount,
    SUM(amount) OVER (PARTITION BY salesperson_id ORDER BY sale_date) AS cumulative_sales
FROM
    sales;

LAG() 偏移函数

还是在上面的销售信息表中,我们可以通过LAG()函数获取每个销售记录的前一个销售记录的金额,如下所示。

SELECT
    salesperson_id,
    sale_date,
    amount,
    LAG(amount, 1, 0) OVER (PARTITION BY salesperson_id ORDER BY sale_date) AS previous_amount
FROM
    sales;

NTILE() 分布函数

这个操作我们可以在学生成绩表中进行演示,如下所示,使用 NTILE() 函数将学生按成绩分成四组。

SELECT
    student_id,
    student_name,
    score,
    NTILE(4) OVER (ORDER BY score DESC) AS quartile
FROM
    students_scores;

FIRST_VALUE() 累计函数

在销售信息表中,我们可以通过FIRST_VALUE()函数获取每个销售人员的第一笔销售记录的金额,如下所示。

SELECT
    salesperson_id,
    sale_date,
    amount,
    FIRST_VALUE(amount) OVER (PARTITION BY salesperson_id ORDER BY sale_date) AS first_sale_amount
FROM
    sales;

总结

上面的这些例子展示了如何使用MySQL的窗口函数来执行各种数据分析任务。然后可以通过OVER子句,定义计算窗口的分区和排序规则,从而在查询结果集中进行复杂的计算而不丢失行数据。窗口函数大大增强了SQL的表达能力,数据分析和报告生成中非常有用,因为它们能够在不丢失行的情况下对数据进行复杂的计算和分析。MySQL从8.0版本开始支持窗口函数,大大增强了其数据处理能力。

相关推荐

IntelliJ IDEA插件开发(java开发idea插件)

引言IntelliJIDEA是JetBrains公司开发的一款广受欢迎的集成开发环境(IDE)。它不仅支持Java等多种编程语言,还通过插件系统提供了强大的扩展能力。本分享旨在介绍如何使用Java开...

如何验证自己的idea或者如何产生idea?小编教你如何检索……

申请专利前首先要做的是检索查重,如果你的构思已经被别人申请过专利,那么就不符合专利“新颖性”的要求。因此,如果你有了idea之后如何验证自己的idea具备新颖性,或者如何产生idea呢?今天,小编带着...

idea激活码失效了,这样解决,稳定使用!

最近官网封控比较严格,正式版激活码是不是又掉线了?掉线请看这里,这里有一个解决的方法,就是让工具不联网就可以继续使用激活码了。激活码本来就叫离线激活码,现在要怎么使id工具不联网?·可以打开这里帮助,...

5分钟解决 IntelliJ IDEA 使用问题(免费激活至 2100 年)

直接进入正题!效果安装1.官网下载idea...

【中高级前端必看】- 结合代码实践,全面学习前端工程化

前言前端工程化,简而言之就是软件工程+前端,以自动化的形式呈现。就个人理解而言:前端工程化,从开发阶段到代码发布生产环境,包含了以下几个内容:开发构建测试部署...

Android绘制流程(android界面绘制)

Android绘制流程来源:极客头条MFC、WTL、DuiLib、QT、Skia、OpenGL。Android里面的画图分为2D和3D两种:2D是由Skia来实现的,3D部分是由OpenGL实现...

ExpandListView 的一种巧妙写法(g的另一种写法上下两个圈连起来怎么打)

ExpandListView大家估计也用的不少了,一般有需要展开的需求的时候,大家不约而同的都想到了它然后以前自己留过记录的一般都会找找以前自己的代码,没有记录习惯的就会百度、谷歌,这里吐槽一下,好几...

通过圆形载入View了解自定义View(圆形div怎么搞)

这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程。自定义View是Android学习和开发中必不可少的一部分。通过自定义View我们可以制作丰富绚丽的控件,自定...

鸿蒙开源第三方组件——自定义流式布局组件FlowLayout_ohos

前言基于安卓平台的自定义流式布局组件FlowLayout(https://blog.csdn.net/fzhhsa/article/details/103003019),实现了鸿蒙的功能化迁移和重构...

「经典总结」一个View,从无到有会走的三个流程,你知道吗?

...

手把手带你写FlowLayout(流式布局)

流式布局在android中主要应用在搜索记录和用户标签,下面是效果图首先我们分析流式布局的原理。其实就是当一个子view加上之前的子view的宽度超过了父容器的宽度的时候就换行。接下来我们手把手书写流...

Android View(android view使用mvvm架构)

AndroidUI界面架构每个Activity包含一个PhoneWindow对象,PhoneWindow设置DecorView为应用窗口的根视图,在里面就是TitleView和ContentView...

《教你步步为营掌握自定义View》一文读后感

今天读了简书作者[milter]的一篇文章《教你步步为营掌握自定义View》,大有裨益。作者以幽默风趣、通俗易懂的大白话一步步讲述了View的来龙去脉,甚是详尽,实属自定义View文集中的一篇非常优秀...

Android面试官:你究竟有多大的勇气,在简历上写了“精通”?

所周知,简历上“了解=听过名字;熟悉=知道是啥;熟练=用过;精通=做过东西”。最近在面试,我现在十分后悔在简历上写了“精通”二字…先给大家看看我简历上的技能清单:良好的java基础,熟悉掌握面向对象思...

iOS 视图---动画渲染机制探究(动画渲染用哪个软件最好)

腾讯Bugly特约作者:陈向文终端的开发,首当其冲的就是视图、动画的渲染,切换等等。用户使用App时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅。UI就是App的门面,它的体验伴...

取消回复欢迎 发表评论: