mysql8的组内排名

2024-03-13 19:38
文章标签 mysql8 组内 排名

本文主要是介绍mysql8的组内排名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标效果

模拟数据如下:

DROP TABLE IF EXISTS `test_sum`;
CREATE TABLE `test_sum` (`year` SMALLINT NOT NULL,`province` VARCHAR(32) NOT NULL,`num` INT UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `test_sum` (`year`,`province`,`num`) VALUES
(2018,'北京',1),
(2018,'上海',3),
(2018,'浙江',7),
(2019,'北京',5),
(2019,'上海',5),
(2019,'浙江',11);

目标实现三个场景:

  • 结果集会显示全局排名在这里插入图片描述

    排名分有间隔和无间隔两种情况:主要区别为出现并列排名后,下一个排名是按行号,还是在上一个排名后+1

  • 结果集分几个组后独立排名
    在这里插入图片描述
  • 结果集分几个组后显示每行数据、和合计值
    在这里插入图片描述

实现方案

因为不同MySQL版本,实现方案有所不同,下面分开介绍方案。

小提示:判断MySQL函数在哪个版本支持,可以在MySQL官方的《函数和运算符参考文档》中查找、对比不同版本。

MySQL 8.0

MySQL 8.0提供了窗口函数1。其实现的核心,通过window获取结果集、在window中可以指定排序和分组,然后主查询通过over连接window结果集,进行相应运算。窗口函数包括排名等函数。

全局排名

只要使用内置的rank()dense_rank()函数2即可。

SELECT *,ROW_NUMBER() OVER w AS '行号',RANK()       OVER w AS '排名-有间隔',DENSE_RANK() OVER w AS '排名-无间隔'
FROM `test_sum` 
WINDOW w AS (ORDER BY `num`);

WINDOWOVER是窗口函数的主要特征。

分组排名

分组排名的实现,与上面全局排名的区别,仅仅是WINDOW中增加了PARTITION

SELECT *,ROW_NUMBER() OVER w AS '行号',RANK()       OVER w AS '排名-有间隔',DENSE_RANK() OVER w AS '排名-无间隔'
FROM `test_sum`
WINDOW w AS (partition by `year` ORDER BY `num`)

合计

SELECT *, SUM(`num`) over w AS '分组合计'
FROM `test_sum` 
WINDOW w AS (partition by `year`)
ORDER BY `year`, `province`

窗口函数下的分组合计,和之前理解的group分组有所不同,区别在于合计函数并不会导致分组的行合并成一行。

小结

思考窗口函数的实现思路,看起来像是window查询出后,按照排序、分组在内存中组织临时表(有序、指定分区),然后按分区开始运算主查询函数,运算后的结果按分区键关联到临时表中,然后整合数据输出。

window中指定排序、主查询不指定排序,最终的结果是按window的排序来输出,而不是主查询默认的顺序;而多个window都指定了排序时,会使用最后一个的排序(可以尝试同个列用升序和降序),因而有此猜测。
后面会考虑追踪sql执行过程、验证猜想,有结果再补充更新本文。

 

转载地址:https://blog.csdn.net/zgdwxp/article/details/102696341 

这篇关于mysql8的组内排名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805975

相关文章

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

使用shell脚本安装mysql8,进行主从备份配置

思路 在3台主机上安装mysql进行主从备份配置 使用rpm包yum安装mysql 首先,我们要准备好安装文件,首先下载rpm包 wget -P "/opt/" https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm 然后执行安装(默认已配置阿里云的yum仓库 yum -y install mysql80

影响关键词排名稳定的因素有哪些?

网站上线了很久关键词还是没有出现排名,很多站长都非常关心这个问题,为什么我正常优化的网站就是没有排名呢?下面,曾庆平SEO为大家分析一下影响关键词排名的因素有哪些,快看一下自己的网站是不是出现了以下问题。 一、网站内部结构 首先网站一定要充分考虑两个方面,一个是用户,一个就是搜索引擎。 (1)用户喜欢什么样的网站?网站主题是不是够明确?用户在进入网站后如果在几秒内看不懂网站的主题就会退

怎么分析竞争对手提高网站排名?

想做好seo就要学会分析竞争对手,知己知彼,方能百战百胜。近来许多做网站的站长们都不知如何去分析竞争对手,如何从竞争对手那里得到有效的方法,来提升自己网站的权重,那么今天就给大家理个思路把这套方法教给大家。 分析就是要发现其薄弱点及可取之处任何事情都不是无懈可击的,如果一个网站真的无懈可击了,那么排名也不可能经常浮动变化了。而分析竞争对手网站,就是要发现其可取之处和不足的地方。如果一个网站主要

网站品牌为何对于SEO排名如此重要?

为什么你网站没有排名,因为你网站的品牌不够,你想一下,同样一个产品关键词,你要是百度,你会给京东,还是给一个不知名的小公司,所以品牌是决定百度SEO排名最重要的因素之一。 你可能还是不能够理解,为何还有很多不知名的网站排名一样非常好,百度排名是根据综合因素给出排名的,只是品牌是排名的重要因素之一。而判断品牌,百度也是根据综合因素来判断,我们还是从头说起。 医疗行业为什么难做排名 我想医

那么手机网站关键词优化排名该怎样做?

现今移动端流量的增长,这让越来越多的企业逐渐重视起移动端网站的用户流量,做好移动SEO排名优化效果已是刻不容缓的。但移动端网站推广的方式和技巧有很大的差异,如用PC端的优化方式来做手机网站关键词排名,那么这样的移动端网站排名是很难有较大的提升的。那么手机网站关键词优化排名该怎样做? 1、网站的logo PC端的网站首页权重最高的位置就是在左上角,因此我们市场会看到这个位置均放置的为网站logo

SQLSERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER

SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER 前言 本文意于用实例数据帮助理解SQL SERVER排名函数RANK,DENSE_RANK,NTILE,ROW_NUMBER。 准备工作 创建测试表:   ? 1 2 3 4 5 create table test( id int identity(1,1)

Mysql8在centos下的文件目录更换问题

解决mysql8更换数据文件目录的受限问题,临时或永久关闭selinux即可。具体见这篇文章。 https://blog.csdn.net/qq_17641711/article/details/81262866

MySQL - 排名实现

一、实现步骤 1、实现自然排名 SELECT id, name, score, -- 排名变量每次+1,实现自然排名@curr_row_rank := @curr_row_rank + 1 AS rank FROM scores, (SELECT -- 定义一个变量,每条记录+1,用于标识自然的排名@curr_row_rank := 0) varsORDER BY-- 排序必须存在sco

海外媒体发稿:排名靠前的Vents杂志网站发布新闻通稿-大舍传媒

海外媒体发稿:排名靠前的Vents杂志网站发布新闻通稿 近日,知名海外媒体Vents杂志网站发布了最新一期新闻通稿,涵盖了音乐、娱乐、新闻等多个领域的热点事件。作为一家自2009年成立以来便致力于为全球读者提供第一手资讯的在线媒体,Vents杂志在全球范围内享有盛誉。 Vents杂志网站的新闻通稿详细报道了近期全球范围内音乐、娱乐、新闻等领域的热点事件。其中包括了某国际巨星的独家专访、某电影作