mysql窗口函数(Window Functions)详解

mysql 窗口函数(Window Functions)详解

窗口函数是 SQL 中的一种强大工具,它允许你在不改变原始表行数的情况下对数据进行聚合计算。与传统的 GROUP BY 不同,窗口函数不会将多行合并为一行,而是可以在每一行上应用聚合操作,同时保留原始的行结构。这使得窗口函数非常适合用于复杂的分析任务,例如:

  • 移动平均:计算某个时间段内的平均值。
  • 排名:为每行数据分配一个排名。
  • 累计和:计算到当前行为止的累计总和。
  • 前后行比较:比较当前行与前几行或后几行的数据。

1. 窗口函数的基本语法

窗口函数的通用语法如下:

window_function(expression) OVER (
    [PARTITION BY partition_expression]
    [ORDER BY order_expression]
    [frame_clause]
)
  • window_function:这是你想要应用的聚合函数或排名函数,例如 SUM()AVG()ROW_NUMBER()RANK() 等。
  • expression:要应用于窗口函数的列或表达式。
  • OVER:指定窗口的范围,告诉 SQL 引擎如何划分数据并应用窗口函数。
  • PARTITION BY:可选。类似于 GROUP BY,但它不会减少行数。它将数据划分为多个分区(或“窗口”),并在每个分区内独立应用窗口函数。
  • ORDER BY:可选。指定窗口内数据的排序顺序。这对于需要按顺序处理的函数(如 ROW_NUMBER()LAG())非常重要。
  • frame_clause:可选。定义窗口的“框架”,即窗口函数作用的行范围。你可以指定从当前行向前或向后扩展的行数。

2. 窗口函数与 GROUP BY 的区别

  • GROUP BY:将多行合并为一行,并对每一组数据进行聚合计算。结果集中的行数会减少。

    SELECT department, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department;
    
    • 这条查询会返回每个部门的平均工资,结果集中每一行代表一个部门。
  • 窗口函数:在每一行上应用聚合计算,但不会减少行数。结果集中的行数与原始表相同,只是每一行都包含了一个新的聚合值。

    SELECT id, name, department, salary,
           AVG(salary) OVER (PARTITION 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值