mysql 窗口函数分类
时间: 2023-10-26 11:41:48 浏览: 238
MySQL 支持的窗口函数可以分为以下几类:
1. 聚合函数类:SUM、AVG、MAX、MIN、COUNT 等函数,可以对分组后的数据进行统计计算。
2. 排名函数类:ROW_NUMBER、RANK、DENSE_RANK、NTILE 等函数,可以根据某些列的值对数据进行排序,并给每行分配一个排名。
3. 分析函数类:LEAD、LAG、FIRST_VALUE、LAST_VALUE、PERCENT_RANK 等函数,可以在排序后的数据中获取某一行前后的数据。
4. 累计函数类:CUME_DIST、PERCENTILE_CONT、PERCENTILE_DISC、LISTAGG 等函数,可以计算某一列在排序后的数据中的排名百分比或字符串拼接等操作。
以上是 MySQL 中常用的窗口函数分类,不同的窗口函数有不同的功能,可以根据具体的需求选择不同的函数。
相关问题
mysql窗口函数
### MySQL 中窗口函数的使用方法
#### 使用场景与基本概念
窗口函数是在数据库查询中用于执行特定计算的一类特殊函数,尤其适用于计算聚合值(如总和、平均值)以及进行排名和排序操作[^2]。这类函数能够在保持原始表行数不变的情况下,在指定的数据集范围内应用聚合逻辑。
#### 函数分类及其功能
对于MySQL中的窗口函数而言,主要分为两类:一类是基于聚合运算的窗口函数;另一类是非聚合性质的窗口函数。其中,序号函数属于后者,具体包含了`ROW_NUMBER()`、`RANK()` 和 `DENSE_RANK()`三个常用的成员,它们能够帮助实现分组排序的同时给每条记录分配相应的顺序编号[^3]。
#### 实际运用实例
下面通过具体的SQL语句来展示如何利用上述提到的不同类型的窗口函数:
- **获取员工工资排名**
假设有一个名为`employees`的表格存储着公司职员的信息,其中包括部门ID(`dept_id`)和个人薪资(`salary`)两列数据。为了得到每位员工在其所在部门内部按照薪水高低排列的位置,可以采用如下方式编写查询语句:
```sql
SELECT dept_id, emp_name, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS row_num,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank_val,
DENSE_RANK()OVER (PARTITION BY dept_id ORDER BY salary DESC) AS dense_rank_val
FROM employees;
```
此段代码会为每一个部门生成一份按月薪降序排列的成绩单,并分别给出三种不同形式的名次标记——连续无重复项的`ROW_NUMBER()`、允许跳跃但不存在相同等级别的`RANK()`还有紧凑型即不会跳过的版本`DENSE_RANK()`。
#### 序号函数的区别说明
需要注意的是,虽然这三者都可用于创建序列化的索引标签,但在处理相等情况下的表现有所差异。当遇到多个具有完全一致数值的情况时,`ROW_NUMBER()`会给每一笔独立赋值而忽略其实际是否真的存在区别;相比之下,`RANK()`则会让这些相同的项目共享同一个较高的位次,之后再继续往下计数留下空白间隔;至于`DENSE_RANK()`同样给予平局选手共同享有最高可能得分的机会,不过后续编排并不会因此受到影响依旧紧密相连下去。
mysql窗口函数orderby
### 使用窗口函数配合 ORDER BY 进行排序
在 MySQL 中,窗口函数可以与 `ORDER BY` 子句一起使用来实现更复杂的排序需求。通过这种方式不仅可以对查询结果进行全局排序,还可以在同一查询中计算每行相对于其他行的位置。
对于简单的排名操作,可以直接应用如下 SQL 语句:
```sql
SELECT name, genre, updated,
RANK() OVER (ORDER BY updated) AS rank_updated
FROM game;
```
上述代码展示了如何统计每个游戏的名字、分类以及更新日期,并按照更新时间给定一个序号[^1]。
当涉及到多列排序时,则可以在 `ORDER BY` 后面指定多个字段及其排序方向:
```sql
SELECT *,
RANK() OVER (
ORDER BY released DESC, size ASC
) AS rank_released_size
FROM game;
```
这段脚本用于找出较新的同时安装包体积较小的游戏,在这里先依据发布日期降序排列再根据大小升序处理相同发布时间的数据项。
如果希望在外层再次利用不同的条件做进一步排序展示,也可以这样做:
```sql
SELECT name,
RANK() OVER (ORDER BY editor_rating) AS r_editor_rating
FROM game
ORDER BY size DESC;
```
此命令首先基于编辑评分给出内部排名,最后整个结果集则依照文件尺寸从大到小展现出来。
除了普通的 `RANK()` 函数之外还有其他的变体比如 `DENSE_RANK()` 可供选择,这取决于具体的应用场景和业务逻辑的要求。
#### DENSE_RANK() 的描述
不同于标准的 `RANK()` 方法可能会跳过某些数值(例如两个并列第二之后直接跟第四),而 `DENSE_RANK()` 则不会跳跃任何整数位次,从而使得产生的序列更加紧凑连续。
阅读全文
相关推荐















