窗口函数实战指南:轻松掌握排名计算技巧,提升数据处理效率

窗口,函数,实战,指南,轻松,掌握,排名,计算,技巧,提升,数据处理,效率 · 浏览次数 : 747

小编点评

**窗口函数的应用场景** 窗口函数是一种在处理数据时,对数据进行分组和排序的函数。它比聚合函数更灵活,可以帮助我们更灵活地处理数据并获得所需的结果。 **RANK函数** RANK函数使用排名进行分组,并为每个组分配一个排名号。它可以用于在多个维度上进行分组和排序。 **DENSE_RANK函数** DENSE_RANK函数使用去重进行分组,并为每个组分配一个排名号。它可以用于在多个维度上进行分组和排序,但它不会为每个组分配一个排名号。 **使用窗口函数查询学生数据** 可以使用窗口函数来查询学生数据,例如: * 查询本年级各个科目前2名的同学。 * 查询这次考试每个班级中各个科目的前2名的同学。 * 查询这次考试每个班级中的总分排名前2名。 **结论** 窗口函数是 SQL 函数中非常强大的工具,特别是在报表统计等场景领域。它们可以简化复杂的数据计算和分析,并提高查询效率和灵活性。

正文

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

前言

SQL语句中,聚合函数在统计业务数据结果时起到了重要作用,比如计算每个业务地区的业务总数、每个班级的学生平均分以及每个分类的最大值等。然而,今天我将介绍窗口函数,与聚合函数相比,它们也是一组函数,但在使用方法和适用场景上有所不同。在本章节中,我将重点介绍窗口函数中的RANK和DENSE_RANK函数,以及它们在排名和筛选方面的应用场景。这些窗口函数可以帮助我们更灵活地处理数据并获得所需的结果,需要注意的是,目前主流的数据库对窗口函数的最低需求版本如下:

Mysql (>=8.0)
PostgreSQL(>=8.4)
SQL Server(>2005)
SQLite(>3.25.0)

如果您的数据库版本低于上述要求,将无法使用窗口函数。

需求背景:

为了让大家更好的理解,我将以学生数据作为查询的条件背景:假设现在某个学校的某个年级的同学完成了一次考试,成绩也已经录入到数据库中:

现在该年级的教务主任想要看一下:

1.这次考试本年级各个科目的前2名的同学。

2.这次考试每个班级中各个科目的前2名。

3.这次考试每个班级中的总分排名前2名。

如果用普通的SQL查询即麻烦也费时间,而使用RANK和DENSE_RANK函数就可以很快的查询出想要的学生数据,下面将为大家介绍如何使用RANK和DENSE_RANK函数实现学生数据的查询。

使用聚RANK和DENSE_RANK函数查询学生数据

1.查询本年级各个科目前2名的同学。

为了获得各个不同科目各自的前2名,我们需要先使用 Rank() 函数来给每个学生在各自科目的分区打上成绩排名, 执行如下SQL 语句,查询出来的结果如下图。

select sd.*, RANK() over(partition by subject order by score desc) as _rank from score_data sd;

可以看到,执行结果里面已经根据各个科目的成绩得到了排名字段 _rank, 接下来只需要使用过滤掉 _rank 字段大于2的部分即可,查询的结果如下图所示。

select * from (

select sd.*, RANK() over(partition by subject order by score desc) as _rank from score_data sd

) tmp

where tmp._rank <=2

从上图中看到如果存在成绩一样的情况,就会出现像数学科目的查询结果:数学查询出来了三个值(因为有两个人的数学成绩是一样的77分),如果我们只想保留一条重复的数据,我们可以使用DENSE_RANK函数,这个函数的计算语法和 RANK 基本一致,唯一不同的点在于, Rank 计算时会得到成绩高于当前行的记录的总行数,也就是上图查询出来的数学科目的三条数据,而DENSE_RANK 则是计算成绩高于当前行的去重记录的总行数,也就是说,如果出现像上图的数学科目中的重复的数据,就会去掉重复的数据。

2.查询每个班级中各个科目的前2名。

查询每个班级中各个科目的前2名只需要在第一步(查询本年级各个科目前2名的同学)的加上一个 class 班级的分区规则即可,查询的结果如下图所示:

select * from (

select sd.*, RANK() over(partition by subject, class order by score desc) as _rank from score_data sd

) tmp

where tmp._rank <=2

3. 查询每个班级中的总分排名前2名。

同理,在第二步(查询score_data表中每个班级中各个科目的前2名)的基础上再添加一个成绩的总和SUM(score)函数即可查询每个班级中的总分前两名。

select class,name,SUM(score) AS total_score,

RANK() over (PARTITION by class order by SUM(score) desc)

from score_data sd group by class,name


在这个指标的计算中,需要把聚合函数和排名函数结合起来使用,因为每个人的总成绩被拆分为了多个科目的和,所以需要在班级和科目的联合分组维度上进行聚合,把数据压缩到每人总分的颗粒度。

总结

窗口函数是 SQL 函数中非常强大的工具,尤其是在报表统计等场景领域。它们不仅能够简化复杂的数据计算和分析,还能提高查询效率和灵活性。窗口函数就像是数据库操作中最锋利的瑞士军刀,为我们提供了一种强大而精确的方式来处理数据。

扩展链接:

Spring Boot框架下实现Excel服务端导入导出

项目实战:在线报价采购系统(React +SpreadJS+Echarts)

Svelte 框架结合 SpreadJS 实现纯前端类 Excel 在线报表设计

与窗口函数实战指南:轻松掌握排名计算技巧,提升数据处理效率相似的内容:

窗口函数实战指南:轻松掌握排名计算技巧,提升数据处理效率

> 摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:[葡萄城官网](https://www.grapecity.com.cn/),葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 # 前言 SQL语句中,聚合函数在统计业务数据结果时起到了重要作用,比如计算每个业务地区的业

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

上一篇文章[《如何用窗口函数实现排名计算》](https://www.cnblogs.com/powertoolsteam/p/17627928.html)中小编为大家介绍了窗口函数在排名计算场景中的应用,但实际上窗口函数除了可以进行单行计算,还可以在每行上打开一个指定大小的计算窗口,这个计算窗口可

如何利用窗口函数实现精确排名计算?

前言 SQL语句中,聚合函数在统计业务数据结果时起到了重要作用,比如计算每个业务地区的业务总数、每个班级的学生平均分以及每个分类的最大值等。然而,今天小编将为大家介绍窗口函数,与聚合函数相比,它们也是一组函数,但在使用方法和适用场景上有所不同。在本章节中,我将重点介绍窗口函数中的RANK和DENSE

row_number函数的不稳定性

row_number窗口函数的排序是不稳定排序,行的物理顺序可能会发生变化,通过巧妙的构思实现排序的稳定。

SQL窗口分析函数使用详解系列三之偏移量类窗口函数

1.综述 本文以HiveSQL语法进行代码演示。 对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库。 已更新第一类聚合函数类,点击这里阅读 ①SQL窗口函数系列一之聚合函数类 ②SQL窗口函数系列二之分组排序窗

SQL KEEP 窗口函数等价改写案例

一哥们出条sql题给我玩,将下面sql改成不使用keep分析函数的写法。 select deptno, ename, sal, hiredate, min(sal) keep(dense_rank first order by hiredate) over(partition by deptno)

MySQL8新特性窗口函数详解

本文博主给大家详细讲解一波 MySQL8 的新特性:**窗口函数**,相信大伙看完一定能有所收获🤓。 - 本文提供的 sql 示例都是基于 MySQL8,由博主亲自执行确保可用 - 博主github地址:http://github.com/wayn111 ,欢迎大家关注,点个star # 简介 M

语音信号处理中的“窗函数”

文章代码仓库:https://github.com/LXP-Never/window_fun 窗函数贯穿整个语音信号处理,语音信号是一个非平稳的时变信号,但“**短时间内可以认为语音信号是平稳时不变的,一般 10~30ms**。 对连续的语音分帧做STFT处理,等价于截取一段时间信号,对其进行周期性

在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件

在使用DevExpress的GridView的时候,我们为了方便,往往使用一些扩展函数,动态创建GridView列的编辑控件对象,然后我们可以灵活的对内容进行编辑或者使用一些弹出的对话框窗体进行处理内容的录入,本篇随笔就是介绍这一主题:在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理

本文将深入揭示TCP/IP滑动窗口的工作原理,探讨其在确保数据准确性和实现高效通信方面的重要性。