当前位置: 首页> 娱乐> 明星 > 江苏恒博网络推广有限公司_邢台贴吧今日头条_新闻稿代写_江苏提升关键词排名收费

江苏恒博网络推广有限公司_邢台贴吧今日头条_新闻稿代写_江苏提升关键词排名收费

时间:2025/7/12 6:17:45来源:https://blog.csdn.net/wgdzg/article/details/146262877 浏览次数:0次
江苏恒博网络推广有限公司_邢台贴吧今日头条_新闻稿代写_江苏提升关键词排名收费

MySQL 从 8.0 开始支持窗口函数(Window Functions),这些函数允许对查询结果集的某一部分(称为“窗口”)执行计算,而不需要对结果进行分组(GROUP BY 会导致结果集被聚合)。窗口函数与普通聚合函数不同,它不会减少查询结果集的行数,而是为每行保留独立的计算结果。

以下是 MySQL 支持的窗口函数分类和功能介绍:

1. 排名函数(Ranking Functions)

排名函数用于为结果集中的每一行分配一个排名值,通常基于 ORDER BY 子句。

1.1 ROW_NUMBER()

  • 用于为每一行分配一个唯一的行号,从 1 开始递增。
  • 同一窗口内的行号不会重复。

示例:

SELECT employee_id,salary,ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number
FROM employees;

1.2 RANK()

  • 为每一行分配排名,相同值的行会拥有相同的排名,但后续的排名会跳过。
  • 如果两行的值相同,它们的排名相同,而下一个排名会跳过。例如:1, 2, 2, 4。

示例:

SELECT employee_id,salary,RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees;

1.3 DENSE_RANK()

  • 类似于 RANK(),但不会跳过后续排名。
  • 如果两行的值相同,它们的排名相同,但下一个排名紧跟其后。例如:1, 2, 2, 3。

示例:

SELECT employee_id,salary,DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank
FROM employees;

1.4 NTILE(n)

  • 将结果集划分为 n 个组(桶),并为每一行分配一个桶编号(从 1 到 n)。
  • 通常用于将数据均匀划分为多个部分(例如四分位数)。

示例:

SELECT employee_id,salary,NTILE(4) OVER (ORDER BY salary DESC) AS quartile
FROM employees;

2. 聚合窗口函数(Aggregate Window Functions)

这些是标准聚合函数(如 SUMAVG 等)的窗口版本,可以在不减少行数的情况下使用。

2.1 SUM()

  • 计算窗口中的值总和。

示例:

SELECT department_id,salary,SUM(salary) OVER (PARTITION BY department_id) AS total_salary
FROM employees;

2.2 AVG()

  • 计算窗口中的平均值。

示例:

SELECT department_id,salary,AVG(salary) OVER (PARTITION BY department_id) AS avg_salary
FROM employees;

2.3 COUNT()

  • 计算窗口中的行数。

示例:

SELECT department_id,COUNT(*) OVER (PARTITION BY department_id) AS employee_count
FROM employees;

2.4 MAX() 和 MIN()

  • 分别计算窗口中的最大值和最小值。

示例:

SELECT department_id,MAX(salary) OVER (PARTITION BY department_id) AS max_salary,MIN(salary) OVER (PARTITION BY department_id) AS min_salary
FROM employees;

3. 值分析函数(Value Functions)

3.1 FIRST_VALUE()

  • 返回窗口中按照 ORDER BY 排序后的第一行的值。

示例:

SELECT employee_id,salary,FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary DESC) AS highest_salary
FROM employees;

3.2 LAST_VALUE()

  • 返回窗口中按照 ORDER BY 排序后的最后一行的值。

示例:

SELECT employee_id,salary,LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary ASC) AS lowest_salary
FROM employees;

3.3 NTH_VALUE()

  • 返回窗口中指定位置的值(从 1 开始计数)。

示例:

SELECT employee_id,salary,NTH_VALUE(salary, 2) OVER (PARTITION BY department_id ORDER BY salary DESC) AS second_highest_salary
FROM employees;

4. 偏移分析函数(Lag/Lead Functions)

4.1 LAG()

  • 返回当前行之前的某一行的值。
  • 如果没有前一行,可以返回默认值。

示例:

SELECT employee_id,salary,LAG(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary DESC) AS previous_salary
FROM employees;

4.2 LEAD()

  • 返回当前行之后的某一行的值。
  • 如果没有后一行,可以返回默认值。

示例:

SELECT employee_id,salary,LEAD(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary DESC) AS next_salary
FROM employees;

5. 窗口定义子句

窗口函数通常使用 OVER 子句定义窗口范围,对结果进行分组和排序。

5.1 PARTITION BY

  • 按某一列对数据分组,每个组有独立的窗口。

5.2 ORDER BY

  • 定义窗口中行的排序规则。

5.3 ROWS 或 RANGE 子句

  • 定义窗口的范围(基于行或值的范围)。

示例:最近 2 条记录的累计薪资

SELECT employee_id,salary,SUM(salary) OVER (ORDER BY employee_id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_sum
FROM employees;

总结

MySQL 提供了以下主要类别的窗口函数:

  1. 排名函数ROW_NUMBER()RANK()DENSE_RANK()NTILE()
  2. 聚合函数SUM()AVG()COUNT()MAX()MIN()
  3. 值分析函数FIRST_VALUE()LAST_VALUE()NTH_VALUE()
  4. 偏移函数LAG()LEAD()

通过这些窗口函数,MySQL 能够高效地处理复杂的分析任务,例如排名、滚动统计、累计计算等。

关键字:江苏恒博网络推广有限公司_邢台贴吧今日头条_新闻稿代写_江苏提升关键词排名收费

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: