本文共 2000 字,大约阅读时间需要 6 分钟。
MySQL从8.0版本开始,引入了类似Sql Server和Oracle的窗口函数功能。窗口函数可以用来在查询中对数据进行分组排序,以下将通过实例详细介绍窗口函数的使用。
以下是用于学生分数的表格和相关查询语句:
DROP TABLE IF EXISTS Marks;CREATE TABLE Marks( 学生 VARCHAR(10), 科目 CHAR(2), 分数 INT);INSERT INTO Marks VALUES ('赵四', '语文', 88), ('赵四', '数学', 48), ('赵四', '英语', 75), ('张三', '语文', 30), ('张三', '数学', 75), ('张三', '英语', 75), ('王五', '语文', 90), ('王五', '数学', 94), ('王五', '英语', 70), ('李四', '语文', 82), ('李四', '数学', 69), ('李四', '英语', 90);
SELECT * FROM Marks;
窗口函数可以大致分为两大类:
SUM、AVG、COUNT、MAX、MIN
等。RANK、DENSE_RANK、ROW_NUMBER
等。以下以SUM
函数为例,展示窗口函数和聚合函数的使用差异。
-- 窗口函数SELECT 学生, 科目, 分数, SUM(分数) OVER (PARTITION BY 学生) AS '总分' FROM Marks;
-- 聚合函数SELECT 学生, SUM(分数) AS '总分' FROM Marks GROUP BY 学生;
在上述两个查询中,窗口函数和聚合函数的结果一致,但窗口函数保留了原始数据的详细信息,可能会出现重复的总分结果。
窗口函数的语法格式如下:
window_function_name(expression) OVER ( [partition_defintion] [order_definition] [frame_definition])
PARTITION BY 学生
会根据学生的姓名进行分区。ORDER BY 分数 DESC
会对每个学生的分数进行降序排序。ROWS
或RANGE
来指定。以下是通过窗口函数实现的分区和排序操作示例。
SELECT 学生, 科目, 分数, MAX(分数) OVER (PARTITION BY 学生 ORDER BY 分数 DESC) AS '最高分' FROM Marks;
窗口框架的作用是限制分区中的数据范围。以下是使用框架定义的示例。
SELECT 学生, 科目, 分数, AVG(分数) OVER (PARTITION BY 学生 ORDER BY 分数 ASC ROWS 2 preceding) AS moving_avgFROM Marks;
除了聚合窗口函数,以下是一些常用的排序窗口函数:
以下是使用这些窗口函数的示例:
SELECT 学生, 科目, 分数, ROW_NUMBER() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS "Row_Number", RANK() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS 'Rank', DENSE_RANK() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS "Dense_Rank", NTILE(4) OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS 'Quartile' FROM Marks;
通过这些窗口函数,可以对数据进行排序、分组和分区操作,从而实现复杂的数据分析需求。
转载地址:http://qhffk.baihongyu.com/