IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 玩转SQL窗口函数 -> 正文阅读

[大数据]玩转SQL窗口函数

玩转SQL窗口函数

说明:MySQL8.0 之后才支持窗口函数

1 提前准备

在MySQL8.0版本数据库下新建数据表,插入数据

CREATE TABLE `student`
(   `id`      int(10) DEFAULT NULL,
    `name`    varchar(20) DEFAULT NULL,
    `age`     int(10) DEFAULT NULL,
    `address` varchar(20) DEFAULT NULL
) ENGINE=InnoDB;

insert into student values(1,'zs',23,'Beijing');
insert into student values(2,'ls',21,'Tianjing');
insert into student values(3,'ww',13,'Shanghai');
insert into student values(4,'zl',23,'Beijing');
insert into student values(5,'mq',4,'Nanjing');
insert into student values(6,'wb',3,'Beijing');
insert into student values(7,'hj',21,'Hebei');
insert into student values(8,'sw',34,'Henan');
insert into student values(9,'sa',42,'Beijing');

2 MySQL窗口函数及其语法

分类:

  • 专用窗口函数,比如rank、dense_rank、row_number等

  • 聚合函数,如sum、 avg、count、max、min等

2.1 基本语法

<窗口函数> over (partition by <用于分组的列名>
                order by <用于排序的列名>)

2.2 专用窗口函数示例

2.2.1 rank函数

作用

RANK()函数,顾名思义排名函数,可以对某一个字段进行排名.

示例

根据address分组,再根据age排序

select *,rank() over (partition by address order by age desc) as ranking from student

在这里插入图片描述

2.2.2 dense_rank函数

作用

DENSE_RANK() 函数用来表示排名,与RANK()不同的是,DENSE_RANK() 不会出现空缺数字。比如,如果出现了两个并列的1,DENSE_RANK() 的第三个数仍然是2,而RANK()的第三个数是3。

示例

根据address分组,再根据age排序

select *,dense_rank() over (partition by address order by age desc) as ranking from student

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tavdb8RP-1646454507181)(SQL窗口函数.assets/image-20220305111103656.png)]

2.2.3 row_number函数

作用

ROW_NUMBER()函数作用就是将select查询到的数据进行排序,每一条数据加一个序号,他不能用做于学生成绩的排名,一般多用于分页查询

示例

根据address分组,再根据age排序

select *,row_number() over (partition by address order by age desc) as ranking from student

在这里插入图片描述

2.2.4 first_value函数

作用

FIRST_VALUE() 返回窗口范围内的第一个值。

示例

根据address分组,返回某组中最大age的数量

select *,FIRST_VALUE(age) over (partition by address order by age desc) as ranking from student

在这里插入图片描述

2.2.5 综合使用

相当于将三个函数的排名情况进行对比

select *,
       rank() over (order by age desc) as ranking,
        dense_rank() over (order by age desc) as dese_rank,
        row_number() over (order by age desc) as row_num
from student

在这里插入图片描述
聚合窗口函数,不断向下聚会取结果

select *,
       sum(age) over (order by age) as current_sum,
        avg(age) over (order by age) as current_avg,
        count(age) over (order by age) as current_count,
        max(age) over (order by age) as current_max,
        min(age) over (order by age) as current_min
from student

在这里插入图片描述

3 总结

窗口函数有以下功能:

  • 同时具有分组(partition by)和排序(order by)的功能
  • 不减少原表的行数,所以经常用来在每组内排名

注意事项

  • 窗口函数原则上只能写在select子句中
  • 窗口函数使用场景一般是排名问题和top N问题上

参考:

https://zhuanlan.zhihu.com/p/92654574

https://blog.csdn.net/shaiguchun9503/article/details/82349050

https://doris.apache.org/zh-CN/sql-reference/sql-functions/window-function.html#function%E4%BD%BF%E7%94%A8%E4%B8%BE%E4%BE%8B

https://blog.csdn.net/shaiguchun9503/article/details/82349050

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-06 13:08:12  更:2022-03-06 13:08:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:01:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码