首页 > 数据库 >MySQL窗口函数总结(三)

MySQL窗口函数总结(三)

时间:2024-09-29 14:37:31浏览次数:8  
标签:ROWS 窗口 函数 PARTITION BETWEEN MySQL name

MySQL 窗口函数(Window Functions)是一种高级的 SQL 查询技巧,它允许在结果集的一组相关行上执行计算。窗口函数可以用于处理分组、排序、累计等复杂的聚合任务,使得查询更加简洁和高效。在 MySQL 8.0 及更高版本中,支持窗口函数。
以下是一些常用的窗口函数:

  • ROW_NUMBER():为结果集中的每一行分配一个唯一的整数序号。
  • RANK():为结果集中的每一行分配一个唯一的整数序号,但在具有相同值的行中使用相同的序号。在下一个序号时,会跳过重复的序号。
  • DENSE_RANK():与 RANK() 类似,但不会跳过重复的序号。
  • NTILE(N):将结果集分成 N 个组,并为每一行分配一个组号。
  • CUME_DIST():计算当前行在结果集中的累计分布。
  • PERCENT_RANK():计算当前行在结果集中的百分比排名。
  • LEAD():获取当前行后面的第 N 行的值。
  • LAG():获取当前行前面的第 N 行的值。
  • FIRST_VALUE():获取窗口中的第一行的值。
  • LAST_VALUE():获取窗口中的最后一行的值。
  • NTH_VALUE():获取窗口中的第 N 行的值。

使用窗口函数时,需要定义一个窗口(OVER 子句),它描述了如何为每一行定义相关的行集。窗口定义通常包括以下部分:

  • PARTITION BY:按给定的列或表达式对结果集进行分区。每个分区将被视为一个独立的窗口,窗口函数会在每个分区上分别计算。
  • ORDER BY:定义窗口内行的排序顺序。
  • ROWS/RANGE:定义窗口的大小和形状。ROWS 基于行数,RANGE 基于值范围。

PARTITION BY:PARTITION BY 在窗口函数中的作用类似于分组。它用于将结果集划分为多个分区,以便在每个分区内单独进行窗口函数的计算。通过使用 PARTITION BY 子句,您可以在每个分区内独立地应用窗口函数,而不是在整个结果集中应用。在很多情况下,PARTITION BY 子句非常有用。例如,当您需要对每个部门的员工进行排名时,可以使用 PARTITION BY 根据部门对员工进行分组,然后在每个部门内应用窗口函数(如 RANK() 或 ROW_NUMBER())。
下面是一个使用 PARTITION BY 的示例:
准备数据

-- 创建 employees 表
CREATE TABLE employees (
employee_id INT PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
salary DECIMAL(10, 2) NOT NULL,
department_id INT NOT NULL
);

-- 插入示例数据
INSERT INTO employees (first_name, last_name, salary, department_id) VALUES
('John', 'Doe', 5000.00, 1),
('Jane', 'Smith', 5500.00, 1),
('Mike', 'Brown', 6000.00, 2),
('Emily', 'Johnson', 6500.00, 2),
('Tom', 'Davis', 7000.00, 3),
('Nina', 'Taylor', 5500.00, 3),
('Sophia', 'Lee', 6000.00, 4),
('Daniel', 'Miller', 5800.00, 4);

-- 查询刚刚插入的数据
SELECT * FROM employees;

示例

SELECT 
    department_id, 
    first_name, 
    last_name, 
    salary,
    RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_within_department
FROM employees;

在这个示例中,我们使用 RANK()函数为每个部门的员工分配工资排名。通过在窗口定义中包含 PARTITION BY department_id子句,我们确保了在每个部门内部进行排名计算。
窗口范围
窗口范围(Window Frame)是窗口函数中的一个概念,用于定义在计算窗口函数时所使用的行集合。窗口范围可以限制窗口函数的作用范围,从而影响计算结果。通常,窗口范围是通过 ROWS BETWEEN 或 RANGE BETWEEN 子句定义的。以下是一些常见的窗口范围类型:

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
这个窗口范围包括从分区的第一行到当前行的所有行。在计算窗口函数时,将使用这些行。
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
这个窗口范围包括从当前行到分区的最后一行的所有行。在计算窗口函数时,将使用这些行。
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
这个窗口范围包括分区中的所有行。在计算窗口函数时,将使用这些行。
ROWS BETWEEN N PRECEDING AND M FOLLOWING
这个窗口范围包括从当前行向前 N 行(不包括当前行)到当前行向后 M 行(不包括当前行)的所有行。在计算窗口函数时,将使用这些行。

注意:在使用 RANGE BETWEEN 子句时,窗口范围是基于与当前行具有相同排序值的所有行来确定的。这可能导致不同的行数被包括在窗口范围内,具体取决于排序值的重复情况。下面是一个使用窗口范围的示例:

-- 计算员工的累积工资(包括当前员工和之前的员工)
SELECT 
    employee_id, 
    first_name, 
    last_name, 
    salary,
    SUM(salary) OVER (ORDER BY employee_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_salary
FROM employees;

参考博客: https://www.cnblogs.com/vincent2023/p/17293144.html

 

标签:ROWS,窗口,函数,PARTITION,BETWEEN,MySQL,name
From: https://www.cnblogs.com/jelly12345/p/18439692

相关文章

  • MySQL窗口函数汇总(二)
    MySQL窗口函数详解MySQL从8.0版本开始引入了窗口函数,这是一个强大的特性,可以大大简化复杂的数据分析任务。本文将详细介绍MySQL窗口函数的概念、语法和常见用法,并结合实际应用场景进行说明。什么是窗口函数?窗口函数是一种能够对结果集中的一组行进行操作的函数。它们类似于聚合函......
  • 在线性坐标系中绘制二次函数图象
    本文记述了用Matplotlib在线性坐标系中绘制二次函数图象的例子。代码主体内容如下:...defmain():fig,axs=plt.subplots(1,3,figsize=(14,4.5))#1axs[0]=configure_axes(axs[0],'QuadraticFunction\t\t\t'+r'$\Delta>0$',18,18,10,......
  • shell脚本——检索mysql数据库中得用户,如果没有就创建
     #!/bin/bash#author:goujinyangset-eUSER1=mysqlsiUSER2=dbqueryUSER3=dboperUSER4=yyzcUSERS=($USER1$USER2$USER3$USER4)USER_PASS=123123#MySQL用户名和密码MYSQL_USER="root"MYSQL_PASSWORD="Root#123"#MYSQL_HOST="local......
  • PbootCMS在阿里云主机上邮件发送失败:服务器已经禁用stream_socket_client和fsockopen
    当你遇到PBootCMS网站的留言邮件通知功能失效,并且提示“服务器已经禁用 stream_socket_client 和 fsockopen 函数,请至少开启一个才能发送邮件!”时,这通常是因为服务器的安全策略禁用了这些函数。解决方法如下:步骤1:检查服务器配置登录阿里云主机管理后台:登录阿里云控制台......
  • 生产数据恢复系列之使用my2sql恢复MySQL8 误删数据
    生产数据恢复系列之使用my2sql恢复MySQL8误删数据原创 我科绝伦 小周的数据库进阶之路  2024年09月25日00:00 重庆热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者频率......
  • MySQL索引详解
    MySQL索引详解什么是索引索引(Index)是数据库中用于提高查询速度的数据结构,类似于书的目录。它为表中的一个或多个列创建了一种顺序结构,以帮助数据库更快地定位和检索数据。当表中的数据量非常大时,查询的性能可能会显著下降,索引的主要作用就是通过减少查询时的扫描范围来提......
  • MySQL实现按分秒统计数据量
    在MySQL中,统计每秒、每分钟、每5分钟、每10分钟、每30分钟的交易量可以通过使用GROUPBY和MySQL的时间处理函数来实现。假设交易记录表名为transactions,交易时间字段为transaction_time,并统计每个时间段的交易量。1.每秒交易量SELECTDATE_FORMAT(transaction......
  • 基于Java&MYSQL&Android的商品比价软件设计与实现20516-计算机毕设定制原创选题推荐(附
                                                 目 录摘要1绪论1.1开发背景1.2研究现状1.3论文结构与章节安排2 商品比价软件APP系统分析2.1可行性分析2.2......
  • (赠源码)Python+django+echars+MySQL+爬虫+大屏 boss直聘数据分析可视化系统的设计与实
    摘要随着互联网的飞速发展和技术的不断进步,数据分析和可视化技术在各个领域都扮演着越来越重要的角色。在人才招聘领域,招聘平台作为连接求职者和招聘公司的重要平台,需要不断创新和提升服务体验。设计和实现一个boss直聘数据分析可视化系统,可以帮助BOSS直聘平台更好地利用数......
  • 【C语言】qsort库函数
    使用qsort排数组升序:代码:#include<stdio.h>#include<stdlib.h>intcmp_int(constvoid*e1,constvoid*e2){ return*(int*)e1-*(int*)e2;}//使用qsort排升序voidtest1(){ intarr[]={9,8,7,6,5,4,3,2,1,0}; intsz=sizeof(arr)/sizeof(arr[0]); ......