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

SQL语法进阶篇(二),数据库复杂查询——窗口函数

在学习和实践窗口函数之前,需要准备好工具,以确保能够顺利编写、运行和调试 SQL 语句。这里我选用的是 Kooboo 的SQL数据库在线工具:

1、创建数据表


2、查询数据表


二、 窗口函数(Window Function)

1. 定义与基本原理

     窗口函数是对一组行(称为窗口)执行计算,并为每一行返回一个结果。它不像传统的聚合函数那样将结果集分组为单个行,而是在不改变结果集行数的情况下,为每一行计算一个聚合值。窗口函数通过OVER子句来定义窗口的范围和排序规则

2. 常见窗口函数类型及用途

核心关键字

  1. PARTITION BY:定义分组窗口。

  2. ORDER BY:窗口内排序。

  3. ROWS/RANGE:定义窗口范围。

  • 聚合窗口函数
    1. 概念:包括SUM()AVG()MIN()MAX()等传统聚合函数作为窗口函数使用。
    2. 使用场景:用于计算累计值、移动平均值等。例如,计算每个月的累计销售额,或者计算最近几个月的移动平均销售额。
    3. 示例:假设有sales表,包含monthsales_amount字段,要计算每个月的累计销售额,可使用以下查询:
      SELECT 
          month,
          sales_amount,
          SUM(sales_amount) OVER (ORDER BY month) AS cumulative_sales
      FROM sales;
      
      -- OVER (ORDER BY month) 表示按照 month 列进行排序,窗口的范围是从结果集的第一行到当前行
      -- AS cumulative_sales:这是为计算结果指定的别名,方便在结果集中引用
  • 排名窗口函数
    1. 概念:包括RANK()DENSE_RANK()ROW_NUMBER()等,用于为结果集中的行分配排名。
    2. 使用场景:对数据进行排名,例如对员工的工资进行排名,找出工资最高的前几名员工。
    3. 示例
      SELECT 
          month,
          sales_amount,
          RANK() OVER (ORDER BY sales_amount DESC) AS sales_rank
      FROM sales;
      
      -- RANK()函数会根据销售额降序排列为每一行分配排名
      -- 如果有相同的销售额,会出现并列排名,且下一个排名会跳过相应的序号
  • 分析窗口函数
    1. 概念:如LAG()LEAD()FIRST_VALUE()LAST_VALUE()等,用于获取当前行前后的数据或窗口内的第一个、最后一个值。
    2. 使用场景:分析数据的变化趋势,例如比较相邻月份的销售额变化。
    3. 示例
      SELECT 
          month,
          sales_amount,
          LAG(sales_amount) OVER (ORDER BY month) AS prev_month_sales
      FROM sales;
      
      -- LAG(sales_amount) OVER (ORDER BY month)会返回当前行上一行的销售额,方便比较相邻月份的销售情况。

3. 窗口范围(Frame)的本质

     窗口函数在ORDER BY排序后,通过 ** 窗口范围(Frame)** 定义参与计算的行集合。它决定了 “当前行” 的上下边界,使得聚合函数(如SUMAVG)或排名函数(如RANK)能在特定范围内计算。

核心作用:精确控制窗口函数的计算范围,实现累计值、滑动平均、移动统计等复杂分析。

  • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:从第一行到当前行。

  • RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW:按时间范围(如7天滑动窗口)。

4. 默认窗口范围:隐式的ROWS模式

若未显式声明ROWSRANGE,窗口函数默认使用:

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

即从排序后的第一行到当前行,形成一个累计窗口。
示例(等价写法):

-- 隐式默认写法
SUM(sales_amount) OVER (ORDER BY month)  

-- 显式声明写法
SUM(sales_amount) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

相关文章:

  • Python 集合
  • C语言 数据结构 【栈】动态模拟实现
  • 学习日志37—基于变分量子电路的量子机器学习算法综述
  • 气质联用仪器GCMSMS配置CTC 性能测试
  • 拥抱AI,永洪vividime迈进数据智能时代
  • 视频设备轨迹回放平台EasyCVR远程监控体系落地筑牢国土监管防线
  • 常用控件的使用
  • Idea将Java工程打包成war包并发布
  • mysql-INNODB_FT_INDEX_TABLE表中的 first_doc_id 和、last_doc_id 和doc_id
  • 软考(软件设计师)之操作系统
  • GRBL运动控制算法(四)加减速运算
  • JAVA接口和继承
  • AI-人工智能-多模态药物识别AI新算法GSFM,为精准药物表征装上“智慧眼”
  • 深入探索 `malloc`:内存分配失败的原因及正确使用规范
  • C语言:32位数据转换为floaf解析
  • RHCSA Linux 系统 文件的查看、复制、移动、重命名、编辑文件
  • GPT-5、o3和o4-mini即将到来
  • PCI认证 密钥注入 ECC算法工具 NID_secp521r1 国密算法 openssl 全套证书生成,从证书提取公私钥数组 x,y等
  • WinForm真入门(11)——ComboBox控件详解
  • 996引擎-源码学习:Cocos2d-Lua 的 class(classname, ...)