mysql窗口函数复习
当谈到 MySQL 窗口函数,它是一种强大的 SQL 工具,可以在查询结果集中进行分析和处理。它们允许在结果集中应用聚合函数,而无需使用 GROUP BY 子句。以下是一些 MySQL 窗口函数的常见用例:
ROW_NUMBER():它为结果集中的每一行生成一个唯一的整数值。可以使用它为每一行指定一个编号。
RANK() 和 DENSE_RANK():这两个函数用于根据排序顺序为结果集中的行指定排名。RANK() 函数会跳过并列项,并且下一个项的排名会相应增加,而 DENSE_RANK() 函数会跳过并列项,但下一个项的排名不会增加。
LAG() 和 LEAD():LAG() 函数返回结果集中当前行之前的指定行数的值,而 LEAD() 函数返回结果集中当前行之后的指定行数的值。这两个函数非常有用,可以用于计算前一个或后一个值与当前值之间的差异。
SUM() OVER():SUM() OVER() 函数用于计算结果集中某一列的累积和。它可以与 PARTITION BY 子句一起使用,以在每个分区内计算累积和。
AVG() OVER():类似于 SUM() OVER(),AVG() OVER() 函数用于计算结果集中某一列的累积平均值。
以上只是一些常见的 MySQL 窗口函数,还有其他诸如 FIRST_VALUE()、LAST_VALUE()、NTILE() 等函数也非常有用。通过使用这些函数,您可以更灵活地对查询结果进行分析和处理。希望这些复习对您有所帮助!
MySQL 窗口函数
MySQL 窗口函数概述
窗口函数(也称为分析函数)允许对查询结果集中的一组行执行计算,而不会改变这些行的物理顺序。这类功能特别适用于复杂的数据分析场景,在不破坏原始数据结构的情况下完成统计和其他操作[^1]。
常见的窗口函数及其应用
1. ROW_NUMBER()
函数
ROW_NUMBER()
是一种常见的窗口函数,它会为分区内的每一行分配唯一的序号。此编号按照指定排序规则递增:
SELECT
employee_id, department_name,
salary,
ROW_NUMBER() OVER (PARTITION BY department_name ORDER BY salary DESC) AS row_num
FROM employees;
这段代码将返回员工表中的记录,并根据部门名称分组,再依据薪资降序排列给每条记录打上序列标签。
2. 转换聚合函数为窗口函数
为了使标准的聚合函数如 SUM()
成为窗口函数来使用,则需要附加 OVER
子句。这样可以保持原有表格布局的同时实现累积求和等功能[^5]:
SELECT
order_date,
product_name,
quantity_sold,
SUM(quantity_sold) OVER () as total_sales -- 计算全部销售量之和
FROM sales;
上述语句展示了如何利用 SUM()
来获取所有商品销量总计的情况;如果希望基于特定维度比如日期来进行累加,则可以在 OVER
后面加入额外参数定义范围。
实际案例展示
考虑这样一个需求:想要知道各部门内部每位成员相对于最高薪者的相对薪酬比例。通过组合多个窗口函数即可轻松达成目标:
WITH ranked_salaries AS (
SELECT
e.employee_id,
d.department_name,
e.salary,
MAX(e.salary) OVER (PARTITION BY d.department_name) max_salary_dept
FROM employees e JOIN departments d ON e.department_id = d.department_id
)
SELECT
rs.employee_id,
rs.department_name,
rs.salary,
ROUND((rs.salary / rs.max_salary_dept), 2)*100 || '%' AS pct_of_max_salary
FROM ranked_salaries rs;
在此例子中,先创建了一个带有最大工资信息的结果集,之后再次选取并计算出每个人的薪水占所在部门最高收入的比例[^3]。
MYSQL 窗口函数
关于MySQL窗口函数的用法
定义与特性
窗口函数是在SQL查询中用于执行复杂计算的一类特殊函数,在不减少原始表行数的情况下提供聚合或其他类型的计算结果。这意味着,不同于GROUP BY
语句汇总并简化数据到更少的行,窗口函数保留输入行的数量不变的同时增加新的列来展示计算的结果[^3]。
基本语法结构
使用窗口函数的基本语法如下所示:
SELECT column_1, ..., window_function() OVER ([PARTITION BY partition_expression]
ORDER BY sort_expression)
FROM table_name;
这里的关键部分是OVER()
子句,它可以指定分区表达式(即定义逻辑上的分组)、排序表达式以及框架子句(可选),这决定了应用于每一行的数据集大小和位置[^1]。
实际应用案例
考虑一个简单的例子,假设有一个名为scores
的成绩表,其中包含学生ID(student_id
)、考试名称(exam_name
)及其对应的分数(score
)字段。为了找出每位学生的最高成绩及该次考试班级内的排名情况,可以编写如下查询:
SELECT student_id,
exam_name,
score,
MAX(score) OVER (PARTITION BY student_id) AS max_score_per_student,
RANK() OVER (PARTITION BY exam_name ORDER BY score DESC) as rank_within_exam
FROM scores;
这段代码不仅返回了每个学生的具体得分,还通过窗口函数展示了他们个人的最佳表现(max_score_per_student),以及他们在各自参加的不同考试中的相对名次(rank_within_exam)。
相关推荐
















