开窗函数简介

本文介绍了数据库中的开窗函数,它们与聚合函数相似但能返回多值。内容包括row_number()、rank()、dense_rank()等常用函数的用法,并通过四个实验展示了如何在SQL查询中使用开窗函数来获取特定聚合信息,例如计数、最大值、最小值等,以解决实际问题。

开窗函数与聚合函数一样,也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值,因为开窗函数所执行聚合计算的行集组是窗口。 

语法:主要是over( PARTITION BY (根据某条件分组,形成一个小组)….ORDER BY(再组内进行排序) …. ) 
常用函数:(最常用的应该是1.2.3 的排序) 
1、row_number() over(partition by … order by …) 
增加一列,类似与增加伪列 
2、rank() over(partition by … order by …) 
3、dense_rank() over(partition by … order by …) 
rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。 
dense_rank(): 连续排序,如果有两个第一级时,接下来仍然是第二级。 
4、count() over(partition by … order by …) 
5、max() over(partition by … order by …) 
6、min() over(partition by … order by …) 
7、sum() over(partition by … order by …) 

### MySQL 开窗函数简介 MySQL自8.0版本起引入了开窗函数的功能,这使得开发者能够更高效地处理复杂查询需求。开窗函数的核心作用是在不改变原始数据集的情况下,基于特定分组或排序条件计算派生值。 #### 基本语法结构 开窗函数的通用语法如下所示[^1]: ```sql <窗口函数> OVER ( [PARTITION BY <列清单>] [ORDER BY <排序列清单>] [<框架子句>] ) ``` 其中: - **`<窗口函数>`** 是指具体的聚合函数或其他支持开窗操作的函数,例如 `ROW_NUMBER()`、`RANK()` 或 `SUM()`。 - **`PARTITION BY`** 定义逻辑分区,类似于按某些字段进行分组。 - **`ORDER BY`** 指定排序规则,在同一分区内应用顺序。 - **`<框架子句>`** 可选部分,用于进一步定义窗口范围(如当前行之前的数据)。 --- ### 实际案例分析 以下是几个常见的开窗函数及其具体应用场景的例子。 #### 示例 1: 行号分配 (`ROW_NUMBER`) 通过 `ROW_NUMBER()` 函数可以为每一条记录按照指定顺序分配唯一的序号。 ```sql SELECT *, ROW_NUMBER() OVER (ORDER BY price DESC) AS row_num FROM product; ``` 此语句会根据价格降序排列产品表中的每一行,并为其赋予唯一编号[^1]。 #### 示例 2: 排名功能 (`RANK`, `DENSE_RANK`) 如果希望获取某项指标下的排名情况,则可利用 `RANK()` 和 `DENSE_RANK()` 来实现无并列跳过的连续排名或者允许存在相同位次的情况。 ```sql -- RANK(): 并列时会产生间隔 SELECT name, score, RANK() OVER(ORDER BY score DESC) as rank_value FROM students; -- DENSE_RANK(): 即使有重复也不会留空档 SELECT name, score, DENSE_RANK() OVER(PARTITION BY class_id ORDER BY score DESC) as dense_rank_value FROM students; ``` #### 示例 3: 聚合运算 (`SUM`, `AVG`) 除了单独针对单条记录外,还可以借助这些聚集类别的方法来统计累计总和或是平均数等信息。 ```sql -- 计算每位员工工资累积总额 SELECT employee_name, salary, SUM(salary) OVER (ORDER BY hire_date ASC) AS running_total_salary FROM employees; -- 获取部门内部薪资均值对比个人所得状况 SELECT department_id, employee_name, salary, AVG(salary) OVER (PARTITION BY department_id) AS avg_dept_salary FROM employees; ``` 以上实例展示了如何灵活运用不同的窗口特性满足多样化的业务诉求。 --- ### 注意事项 尽管开窗函数提供了强大的数据分析能力,但在实际部署过程中仍需注意性能调优方面的问题。对于大规模数据集合而言,不当的设计可能会引发资源消耗过高的现象。因此建议合理规划索引以及审慎选取合适的算法策略以提升效率[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值