展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > MySQL中如何使用开窗函数

MySQL中如何使用开窗函数

(1)开窗函数的定义开窗函数也叫OLAP函数(OnlineAnalyticalProcessing,联机分析处理),主要用来实时分析处理数据。MySQL之前的版本是不支持开窗函数的,从8.0版本之后开始支持开窗函数。#开窗函数语法func_name()OVER([PARTITIONBY][ORDERBYASC|DESC])开窗函数语句解析:函数分为两部分,一部分是函数名称,开窗函数的数量比较少,总共才11个开窗函数+聚合函数(所有的聚合函数都可以用作开窗函数)。根据函数的性质,有的需要写参数,有的不需要写

本文目录

    (1)开窗函数的定义

    开窗函数也叫OLAP函数(Online Analytical Processing,联机分析处理),主要用来实时分析处理数据。MySQL之前的版本是不支持开窗函数的,从8.0版本之后开始支持开窗函数。

    # 开窗函数语法 
    func_name() 
    OVER([PARTITION BY ] 
    [ORDER BY  ASC|DESC])

    开窗函数语句解析:
    函数分为两部分,一部分是函数名称,开窗函数的数量比较少,总共才11个开窗函数+聚合函数(所有的聚合函数都可以用作开窗函数)。根据函数的性质,有的需要写参数,有的不需要写参数。

    另一部分为over语句,over()是必须要写的,里面的参数都是非必须参数,可以根据需求有选择地使用:

    • 第一个参数是partition by + 字段,含义是根据此字段将数据集分为多份

    • 第二个参数是order by + 字段,每个窗口的数据依据此字段进行升序或降序排列

    MySQL中如何使用开窗函数

    开窗函数与分组聚合函数比较相似,都是通过指定字段将数据分成多份,区别在于:

    • SQL 标准允许将所有聚合函数用作开窗函数,用OVER 关键字区分开窗函数和聚合函数。

    • 聚合函数每组只返回一个值,开窗函数每组可返回多个值。

    在这11个开窗函数中,实际工作中用的最多的当属ROW_NUMBER()、RANK()、DENSE_RANK()这三个排序函数了。下面我们通过一个简单的数据集学习一下这三个开窗函数。

    # 首先创建虚拟的业务员销售数据 
    CREATE TABLE Sales
    ( 
    idate date, 
    iname char(2), 
    sales int
    ); 
    # 向表中插入数据 
    INSERT INTO Sales VALUES 
    ('2021/1/1', '丁一', 200), 
    ('2021/2/1', '丁一', 180), 
    ('2021/2/1', '李四', 100), 
    ('2021/3/1', '李四', 150), 
    ('2021/2/1', '刘猛', 180), 
    ('2021/3/1', '刘猛', 150), 
    ('2021/1/1', '王二', 200), 
    ('2021/2/1', '王二', 180), 
    ('2021/3/1', '王二', 300), 
    ('2021/1/1', '张三', 300), 
    ('2021/2/1', '张三', 280), 
    ('2021/3/1', '张三', 280); 
    # 数据查询 
    SELECT * FROM Sales; 
    # 查询各月中销售业绩最差的业务员
    SELECT month(idate),iname,sales, 
    	ROW_NUMBER() 
    	OVER(PARTITION BY month(idate) 
    			 ORDER BY sales) as sales_order 
    FROM Sales;
    
    SELECT * FROM 
    (SELECT month(idate),iname,sales, 
    	 ROW_NUMBER() 
    	 OVER(PARTITION BY month(idate) 
       ORDER BY sales) as sales_order FROM Sales) as t
    WHERE sales_order=1;

    MySQL中如何使用开窗函数

    # ROW_NUMBER()、RANK()、DENSE_RANK()的区别 
    SELECT * FROM 
    (SELECT month(idate) as imonth,iname,sales, 
    ROW_NUMBER() 
    OVER(PARTITION BY month(idate) ORDER BY sales) as row_order,
    RANK() 
    OVER(PARTITION BY month(idate) ORDER BY sales) as rank_order, 
    DENSE_RANK() 
    OVER(PARTITION BY month(idate) ORDER BY sales) as dense_order 
    FROM Sales) as t;

    MySQL中如何使用开窗函数

    ROW_NUMBER():顺序排序——1、2、3
    RANK():并列排序,跳过重复序号——1、1、3
    DENSE_RANK():并列排序,不跳过重复序号——1、1、2

    (2)开窗函数的实际应用场景

    在实际工作或者面试中,可能会遇到求用户连续登录天数、连续签到天数等问题。下面就提供一个用开窗函数解决此类问题的思路。

    # 首先创建虚拟的用户登录表,并插入数据 
    create table user_login
    ( 
    user_id varchar(100), 
    login_time datetime
    ); 
    
    insert into user_login values 
    (1,'2020-11-25 13:21:12'), 
    (1,'2020-11-24 13:15:22'), 
    (1,'2020-11-24 10:30:15'), 
    (1,'2020-11-24 09:18:27'), 
    (1,'2020-11-23 07:43:54'), 
    (1,'2020-11-10 09:48:36'), 
    (1,'2020-11-09 03:30:22'), 
    (1,'2020-11-01 15:28:29'), 
    (1,'2020-10-31 09:37:45'), 
    (2,'2020-11-25 13:54:40'), 
    (2,'2020-11-24 13:22:32'), 
    (2,'2020-11-23 10:55:52'), 
    (2,'2020-11-22 06:30:09'), 
    (2,'2020-11-21 08:33:15'), 
    (2,'2020-11-20 05:38:18'), 
    (2,'2020-11-19 09:21:42'), 
    (2,'2020-11-02 00:19:38'), 
    (2,'2020-11-01 09:03:11'), 
    (2,'2020-10-31 07:44:55'), 
    (2,'2020-10-30 08:56:33'), 
    (2,'2020-10-29 09:30:28'); 
    # 查看数据 
    SELECT * FROM user_login;

    计算连续登录天数通常会有以下三种情况:

    • 查看每位用户连续登录的情况

    • 查看每位用户最大连续登录的天数

    • 查看在某个时间段里连续登录天数超过N天的用户

    针对第一种情况:查看每位用户连续登录的情况
    根据实际经验,我们知道在一段时间内,用户可能出现多次连续登录,这些信息我们都要输出,所以最后结果输出的字段可以是用户ID、首次登录日期、结束登录日期、连续登录天数这四个。

    # 数据预处理:由于统计的窗口期是天数,所以可以对登录时间字段进行格式转换,将其变成日期格式然后再去重(去掉用户同一天内多次登录的情况) 
    # 为方便后续代码查看,将处理结果放置新表中,一步一步操作 
    create table user_login_date(
    select distinct user_id, date(login_time) login_date from user_login);
    # 处理后的数据如下: 
    select * from user_login_date;
    
    # 第一种情况:查看每位用户连续登陆的情况 
    # 对用户登录数据进行排序 
    create table user_login_date_1( 
    select *,
    rank() over(partition by user_id order by login_date) irank 
    from user_login_date); 
    #查看结果 
    select * from user_login_date_1;
     
    # 增加辅助列,帮助判断用户是否连续登录 
    create table user_login_date_2( 
    select *,
    date_sub(login_date, interval irank DAY) idate  #data_sub从指定的日期减去指定的时间间隔
    from user_login_date_1); 
    # 查看结果 
    select * from user_login_date_2; 
    
    # 计算每位用户连续登录天数 
    select user_id, 
    min(login_date) as start_date, 
    max(login_date) as end_date, 
    count(login_date) as days 
    from user_login_date_2 
    group by user_id,idate;
    
    # ===============【整合代码,解决用户连续登录问题】=================== 
    select user_id, 
           min(login_date) start_date, 
           max(login_date) end_date, 
           count(login_date) days 
    from (select *,date_sub(login_date, interval irank day) idate 
    from (select *,rank() over(partition by user_id order by login_date) irank 
    from (select distinct user_id, date(login_time) login_date from user_login) as a) as b) as c 
    group by user_id,idate;

    针对第二种情况:查看每位用户最大连续登录的天数

    # 计算每个用户最大连续登录天数 
    select user_id,max(days) from 
    (select user_id, 
    			 min(login_date) start_date, 
    			 max(login_date) end_date, 
    			 count(login_date) days 
    from (select *,date_sub(login_date, interval irank day) idate 
    from (select *,rank() over(partition by user_id order by login_date) irank 
    from (select distinct user_id, date(login_time) login_date from user_login) as a) as b) as c 
    group by user_id,idate) as d 
    group by user_id;

    针对第三种情况:查看在某个时间段里连续登录天数超过N天的用户

    假如说,我们的需求是查看10/29-11/25在这段时间内连续登录天数≥5天的用户。这个需求也可以用第一种情况查询的结果进行筛选。

    # 查看在这段时间内连续登录天数≥5天的用户 
    select distinct user_id from 
    (select user_id, 
    		min(login_date) start_date, 
    		max(login_date) end_date, 
    		count(login_date) days 
    from (select *,date_sub(login_date, interval irank day) idate 
    from (select *,rank() over(partition by user_id order by login_date) irank 
    from (select distinct user_id, date(login_time) login_date from user_login) as a) as b) as c 
    group by user_id,idate 
    having days>=5
    ) as d;

    这种写法是可以得出结果,但是针对这个问题来说有点麻烦了,下面介绍一个简单的方法:引用一个新的静态窗口函数lead()

    select *, 
    lead(login_date,4) over(partition by user_id order by login_date) as idate5 
    from user_login_date;

    lead函数有三个参数,第一个参数是指定的列(这里用登陆日期),第二个参数是当前行向后几行的值,这里用的是4,也就是第五次登录的日期,第三个参数是如果返回的空值可以用指定值替代,这里没有使用第三个参数。 over语句里面是针对user_id分窗,每个窗口针对登录日期升序。

    用第五次登录日期 - login_date+1,如果等于5,说明是连续登录五天的,如果得到空值或者大于5,说明没有连续登录五天,代码和结果如下:

    # 计算第5次登录日期与当天的差值 
    select *,datediff(idate5,login_date)+1 days 
    from (select *,lead(login_date,4) over(partition by user_id order by login_date) idate5
    from user_login_date) as a; 
    # 找出相差天数为5的记录 
    select distinct user_id 
    from (select *,datediff(idate5,login_date)+1 as days 
    from (select *,lead(login_date,4) over(partition by user_id order by login_date) idate5 
    from user_logrin_date) as a)as b 
    where days = 5;

    【练习】美团外卖平台数据分析面试题——SQL
    现有交易数据表user_goods_table如下:

    MySQL中如何使用开窗函数

    现在老板想知道每个用户购买的外卖品类偏好分布,并找出每个用户购买最多的外卖品类是哪个。

    # 分析题目:要求输出字段为用户名user_name,该用户购买最多的外卖品类goods_kind 
    # 解题思路:这是一个分组排序的问题,可以考虑窗口函数 
    # 第一步:使用窗口函数row_number(),对每个用户购买的外卖品类进行分组统计与排名
    select user_name,goods_kind,count(goods_kind),
    rank() over (partition by user_name order by count(goods_kind) desc) as irank
    from user_goods_table
    group by user_name,goods_kind;
    
    # 第二步:筛选出每个用户排名第一的外卖品类
    select user_id,goods_kind from 
    (select user_name,goods_kind,count(goods_kind),
    rank() over (partition by user_name order by count(goods_kind) desc) as irank
    from user_goods_table
    group by user_name,goods_kind) as a 
    where irank=1
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 MySQL
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Postman macOS版
    Postman macOS版

    Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

    Docker Desktop macOS版
    Docker Desktop macOS版

    Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

    Android Studio macOS版
    Android Studio macOS版

    Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

    Xcode macOS版
    Xcode macOS版

    Xcode 是苹果面向 Mac 提供的官方集成开发环境,将代码编辑、项目构建、SwiftUI 实时预览、设备模拟、自动化测试、断点调试、性能分析和应用分发整合在同一套工作流中,适合开发与维护 iPhone、iPad、Mac、Apple Wa

    JetBrains WebStorm macOS版
    JetBrains WebStorm macOS版

    JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

    PhpStorm macOS版
    PhpStorm macOS版

    PhpStorm 是 JetBrains 推出的专业 PHP 集成开发环境,可在 Mac 上完成代码编写、智能检查、重构、调试、测试和数据库管理。它支持主流 PHP 框架、Composer、Git、Docker 与远程解释器。

    JetBrains PyCharm macOS版
    JetBrains PyCharm macOS版

    JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

    JetBrains IntelliJ IDEA macOS版
    JetBrains IntelliJ IDEA macOS版

    IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

    Visual Studio Code macOS版
    Visual Studio Code macOS版

    Visual Studio Code 是微软提供的免费代码编辑器,支持 macOS,并为 Intel 与 Apple 芯片 Mac 提供适配版本。软件集代码编辑、调试、Git 源代码管理、集成终端和扩展市场于一体。

    REAPER macOS版
    REAPER macOS版

    REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

    Adobe Audition macOS版
    Adobe Audition macOS版

    Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

    Pro Tools macOS版
    Pro Tools macOS版

    Pro Tools 是 Avid 推出的专业数字音频工作站,覆盖多轨录音、无损剪辑、MIDI 编曲、插件处理、自动化混音及声音与画面同步等工作。它拥有 Intro、Artist、Studio 和 Ultimate 等方案。

    WINDOWS 更多
    PixPix 网页版
    PixPix 网页版

    PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。

    Postman Windows版
    Postman Windows版

    Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

    Docker Desktop Windows版
    Docker Desktop Windows版

    Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

    Android Studio Windows版
    Android Studio Windows版

    Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,

    JetBrains WebStorm Windows版
    JetBrains WebStorm Windows版

    WebStorm 是 JetBrains 面向 JavaScript、TypeScript 和现代 Web 技术打造的集成开发环境。它提供项目级代码分析、智能补全、安全重构、导航搜索,并集成调试、测试、终端、Git 与常用前端工具,

    JetBrains PhpStorm Windows版
    JetBrains PhpStorm Windows版

    PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

    JetBrains PyCharm Windows版
    JetBrains PyCharm Windows版

    PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,

    JetBrains IntelliJ IDEA Windows版
    JetBrains IntelliJ IDEA Windows版

    JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

    Visual Studio Code Windows版
    Visual Studio Code Windows版

    Visual Studio Code 是微软推出的免费代码编辑器,Windows 版集成智能补全、代码导航、调试、终端和版本控制,并可通过扩展添加语言、格式化及远程开发能力。它启动较快、配置灵活,

    REAPER Windows版
    REAPER Windows版

    REAPER 是 Cockos 推出的数字音频工作站,适用于录音、MIDI 编曲、音频编辑、混音、母带制作及声音设计。软件安装包小巧,支持多轨录制、灵活路由、自动化、第三方插件和脚本扩展,并提供完整功能的 60 天免费评估期。

    Adobe Audition Windows版
    Adobe Audition Windows版

    Adobe Audition 是面向播客、影视后期、广播与音乐制作的专业音频工作站,提供波形编辑、多轨混音、频谱分析、录音、降噪修复和效果处理等功能。Windows 版通过 Adobe Creative Cloud 安装和管理,

    Pro Tools Windows版
    Pro Tools Windows版

    Pro Tools 是 Avid 推出的专业数字音频工作站,提供多轨录音、音频剪辑、MIDI编曲、插件处理、自动化混音及影视声音制作能力。它适合音乐人、录音师、制作人和音频后期团队使用,并提供免费入门版、订阅方案及永久授权选择。