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

MySQL 8.0:窗口函数

一、基础知识

  1. 定义
    窗口函数(Window Function)对查询结果集的子集(“窗口”)进行计算,保留原始行而非聚合为单行,适合复杂分析(如排名、累积和)。
    基本语法

    函数名() OVER ([PARTITION BY]   -- 按列分组,类似GROUP BY但保留所有行[ORDER BY]        -- 定义窗口内排序[ROWS/RANGE 范围]    -- 指定计算范围
    )
    
  2. 核心组件

    • PARTITION BY:分区列,窗口计算独立于每个分区(如按部门分组)。
    • ORDER BY:分区内排序,影响排名、累积计算逻辑。
    • 窗口帧(Frame)
      • ROWS BETWEEN n PRECEDING AND m FOLLOWING:指定当前行前后包含的行数。
      • RANGE BETWEEN INTERVAL '1' DAY PRECEDING AND CURRENT ROW:按值范围定义(如时间间隔)。

二、窗口函数类型

1. 排名函数
函数描述示例场景
ROW_NUMBER()唯一连续序号(同值不同号)按入职日期排序员工
RANK()允许并列且后续排名跳跃(如1,1,3)销售额排名(同额同排名,后续跳号)
DENSE_RANK()并列排名连续(如1,1,2)工资排名(同薪不跳号)
NTILE(n)数据均分n组并分配组号按工资四分位分组
2. 分析函数
  • LAG(列, 偏移量) / LEAD(列, 偏移量)
    获取当前行前/后指定偏移量的值(如对比上月销售额):
    SELECT sale_date, amount, LAG(amount, 1) OVER (ORDER BY sale_date) AS prev_amount 
    FROM sales;  -- 获取前一条记录
    
  • FIRST_VALUE() / LAST_VALUE()
    返回窗口首行/末行的值(如部门最高工资)。
3. 聚合函数(窗口化)
  • 累积计算
    SUM(sales) OVER (PARTITION BY product_id ORDER BY date) -- 按产品累计销售额
    
  • 移动平均
    AVG(amount) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) -- 近3天移动平均
    

三、性能优化

  1. 索引策略
    • PARTITION BYORDER BY涉及的列创建索引。
http://www.dtcms.com/a/266484.html

相关文章:

  • 【Unity开发】Unity实现对模型移动、缩放、旋转操作的功能
  • 基于Docker构建OrangePi5 SDK环境
  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • 闲庭信步使用SV搭建图像测试平台:第二十九课——绘制正弦波的图片
  • Android 实现底部弹窗
  • Datasophon的Ranger安装时数据库踩坑及问题解决
  • NeighborGeo:基于邻居的IP地理定位(三)
  • NeighborGeo:基于邻居的IP地理定位(二)
  • 【WEB】Polar靶场 6-10题 详细笔记
  • Jenkins-Email Extension 插件插件
  • 前端开发-前置知识
  • Android WebView 性能优化指南
  • Vue2中的keep-alive:组件状态缓存与性能优化实战指南
  • Android发展历程
  • Android 安装使用教程
  • [论文精读]StruQ: Defending Against Prompt Injection with Structured Queries
  • 前端捕获异常的全面场景及方法
  • 算法题目记录
  • OTC机器人焊机节气设备
  • EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
  • web3钱包的运作原理
  • Type-C PD快充协议智能芯片S312L详解
  • GO 语言学习 之 结构体
  • mysql索引:索引应该选择哪种数据结构 B+树 MySQL中的页 页主体 页目录 索引分类
  • C++学习笔记一
  • Mac获取终端历史
  • Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
  • Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
  • Rust+Blender:打造高性能游戏引擎
  • 宽表设计(Wide Table) 与 子表 + 类型 + 属性表设计(EAV 模型或“属性表”模型)