首页 > 数据库 >MySQL窗口函数汇总(二)

MySQL窗口函数汇总(二)

时间:2024-09-29 14:02:36浏览次数:10  
标签:窗口 name 汇总 RANK score MySQL ORDER 函数

MySQL窗口函数详解
MySQL从8.0版本开始引入了窗口函数,这是一个强大的特性,可以大大简化复杂的数据分析任务。本文将详细介绍MySQL窗口函数的概念、语法和常见用法,并结合实际应用场景进行说明。
什么是窗口函数?
窗口函数是一种能够对结果集中的一组行进行操作的函数。它们类似于聚合函数,但不会将结果集缩减为单个行 - 相反,它们为每一行返回一个结果。
窗口函数的语法
基本语法如下:

function_name() OVER (
    [PARTITION BY column_list]
    [ORDER BY column_list]
    [frame_clause]
)
  • function_name: 窗口函数的名称
  • PARTITION BY: 可选,定义行分组的方式
  • ORDER BY: 可选,定义分区内行的排序方式
  • frame_clause: 可选,定义当前分区内的行子集(窗口帧)

常用的窗口函数及其应用场景
1. ROW_NUMBER()
ROW_NUMBER() 为每一行分配一个唯一的整数,用于在每个分区内对行进行排序并编号。可以帮助我们对数据进行分区后排序,获取排名信息。具体来说,ROW_NUMBER() 是一种分析函数,它可以根据 ORDER BY 子句中指定的列对行进行排序,并为每个分区内的行根据排序结果来分配唯一的连续编号。 PARTITION BY 子句类似于 GROUP BY 用于分组,该子句指定希望分区的列或表达式。行号将在每个分区内分配,然后重新开始为下一个分区分配。

SELECT 
    name,
    score,
    ROW_NUMBER() OVER (ORDER BY score DESC) as rank
FROM students;

实际应用场景:查找每个部门的前N名员工
假设我们要找出每个部门薪资最高的3名员工:

CREATE TABLE employees (
    id INT,
    name VARCHAR(50),
    department VARCHAR(50),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (id, name, department, salary) VALUES
(1, 'Alice', 'Sales', 60000),
(2, 'Bob', 'Sales', 50000),
(3, 'Charlie', 'Sales', 55000),
(4, 'David', 'Marketing', 65000),
(5, 'Eve', 'Marketing', 60000),
(6, 'Frank', 'Marketing', 70000),
(7, 'Grace', 'IT', 80000),
(8, 'Henry', 'IT', 75000),
(9, 'Ivy', 'IT', 78000);

SELECT *
FROM (
    SELECT 
        name,
        department,
        salary,
        ROW_NUMBER() OVER (
            PARTITION BY department
            ORDER BY salary DESC
        ) as salary_rank
    FROM employees
) ranked
WHERE salary_rank <= 3
ORDER BY department, salary_rank;

这个查询首先为每个部门的员工按薪资进行排名,然后筛选出排名前三的员工。

2. RANK() 和 DENSE_RANK()

  • RANK() 为每一行分配排名,相同值的行获得相同排名,但会产生间隔。
  • DENSE_RANK() 类似于RANK(),但不会产生间隔。

基本用法:

SELECT 
    name,
    score,
    RANK() OVER (ORDER BY score DESC) as rank,
    DENSE_RANK() OVER (ORDER BY score DESC) as dense_rank
FROM students;

实际应用场景:学生成绩排名
假设我们要为学生的考试成绩进行排名,同时展示 RANK() 和 DENSE_RANK() 的区别:

CREATE TABLE student_scores (
    id INT,
    name VARCHAR(50),
    score INT
);

INSERT INTO student_scores (id, name, score) VALUES
(1, 'Alice', 95),
(2, 'Bob', 95),
(3, 'Charlie', 90),
(4, 'David', 88),
(5, 'Eve', 88),
(6, 'Frank', 85);

SELECT 
    name,
    score,
    RANK() OVER (ORDER BY score DESC) as rank_number,
    DENSE_RANK() OVER (ORDER BY score DESC) as dense_rank_number
FROM student_scores;

这个查询展示了学生成绩的排名,同时显示了 RANK() 和 DENSE_RANK() 的区别。RANK() 会在相同分数后产生间隔,而 DENSE_RANK() 不会。

结论
窗口函数是MySQL 8.0中的一个强大新特性,可以大大简化复杂的数据分析任务。通过上述实际应用场景的例子,我们可以看到窗口函数在处理排名、时间序列数据、累计计算等方面的强大能力。这些函数使得我们能够更高效地处理诸如员工排名、同比增长、累计总和、移动平均等常见的数据分析问题。
随着对窗口函数的深入理解和熟练应用,你将能够编写更简洁、更高效的SQL查询,大大提高数据分析的效率。窗口函数不仅可以简化查询,还可以提高查询性能,因为它们通常比使用子查询或自连接的等效查询更有效率。
继续探索和实践这些窗口函数,你会发现它们在日常数据分析工作中的无穷潜力。

 

标签:窗口,name,汇总,RANK,score,MySQL,ORDER,函数
From: https://www.cnblogs.com/jelly12345/p/18439589

相关文章

  • shell脚本——检索mysql数据库中得用户,如果没有就创建
     #!/bin/bash#author:goujinyangset-eUSER1=mysqlsiUSER2=dbqueryUSER3=dboperUSER4=yyzcUSERS=($USER1$USER2$USER3$USER4)USER_PASS=123123#MySQL用户名和密码MYSQL_USER="root"MYSQL_PASSWORD="Root#123"#MYSQL_HOST="local......
  • 生产数据恢复系列之使用my2sql恢复MySQL8 误删数据
    生产数据恢复系列之使用my2sql恢复MySQL8误删数据原创 我科绝伦 小周的数据库进阶之路  2024年09月25日00:00 重庆热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者频率......
  • 内衣洗衣机哪个牌子好用?五款业内口碑爆棚产品汇总
    内衣裤洗衣机是一种非常实用的洗衣机,可以有效地保护内衣和贴身衣物的质量和卫生,相比于普通的家用大型洗衣机,内衣裤洗衣机在容量、洗涤方式、控制方式和价格等方面有很大的不同之处,如果您经常需要清洗内衣和贴身衣物,那么选择一台内衣裤洗衣机是非常必要的,内衣和贴身衣物在接触人......
  • MySQL索引详解
    MySQL索引详解什么是索引索引(Index)是数据库中用于提高查询速度的数据结构,类似于书的目录。它为表中的一个或多个列创建了一种顺序结构,以帮助数据库更快地定位和检索数据。当表中的数据量非常大时,查询的性能可能会显著下降,索引的主要作用就是通过减少查询时的扫描范围来提......
  • MySQL实现按分秒统计数据量
    在MySQL中,统计每秒、每分钟、每5分钟、每10分钟、每30分钟的交易量可以通过使用GROUPBY和MySQL的时间处理函数来实现。假设交易记录表名为transactions,交易时间字段为transaction_time,并统计每个时间段的交易量。1.每秒交易量SELECTDATE_FORMAT(transaction......
  • 基于Java&MYSQL&Android的商品比价软件设计与实现20516-计算机毕设定制原创选题推荐(附
                                                 目 录摘要1绪论1.1开发背景1.2研究现状1.3论文结构与章节安排2 商品比价软件APP系统分析2.1可行性分析2.2......
  • (赠源码)Python+django+echars+MySQL+爬虫+大屏 boss直聘数据分析可视化系统的设计与实
    摘要随着互联网的飞速发展和技术的不断进步,数据分析和可视化技术在各个领域都扮演着越来越重要的角色。在人才招聘领域,招聘平台作为连接求职者和招聘公司的重要平台,需要不断创新和提升服务体验。设计和实现一个boss直聘数据分析可视化系统,可以帮助BOSS直聘平台更好地利用数......
  • java+springboot+mysql新闻信息检索系统59739-计算机毕业设计原创定制(赠源码)
                                           目 录摘要1绪论1.1选题背景1.2研究意义1.3系统开发技术的特色1.4springboot框架21.5论文结构与章节安排32 新闻信息检索系统分析......
  • MYSQL DML 修改和删除数据
    点击查看代码UPDATEemployeeSETNAME='itheima'WHEREid=1;--更改id1的name为SELECT*FROMemployee;UPDATEemployeeSETNAME='小昭',gender='女'WHEREid=1;--更改ID1的name和ganderSELECT*FROMemployee;UPDATEemployeeSETe......
  • mysql数据库多表查询
    单表查询1、普通查询(1)命令:select*from<表名>;//通匹(2)命令:select<要查询的字段>from<表名>;2、去重查询(distinct)命令:selectdistinct<要查询的字段>from<表名>3、排序查询(orderby)升序:asc降序:desc降序排列命令:select<要查询的字段名>from<表名>orderby<要查......