SQL 变量写法、排序问题 <12>

news2024/9/19 23:46:22

一、定义变量排序

目的1:合并学生表和分数表,将每个班分别排名

目的2:遇到相同分数,考虑还是不考虑相同分数排名

学生表(1000条)和分数表(6000条)分别如下


1、定义变量、简答排序

首先先看一段简单代码:

set @i:=0; -- 定义一个变量i,初始化值为1

SELECT 
	*  -- 查询所有的学生表信息
	,@i:=@i+1  -- 建立排名列,类似于循环 
FROM student

其结果为:除了最后一行的排序字段为新增的,其余的都是student表中的字段

解析代码:

        首先使用set定义一个变量 i ,此时要使用@:=来定义,并且定义完要在最后加上分号表示这条语句单独执行

        使用select语句查询student表时,创建一个新列用来存放排名,排名从1开始,每行加1,所以可以使用外界定义的变量来建立类似于循环的用法

2、不考虑同分排序

先看代码:

-- 定义两个变量
set @i:=0; 
set @last_clazz:='';

SELECT 
	*  -- 输出tt1表的所有字段
	,@last_clazz  -- 定义一个空字段名,此时一整列数据都为空,配合下面赋值语句的结果为将一整列下移一行
	,IF(clazz=@last_clazz,@i:=@i+1,@i:=1) as rank  -- 复制了一整列数据后,判断相同行数据是否一致,如果一致则说明还是一个班级里,排名继续增长,如果不一样,则将i值重新定义为1,从头再开始增长
	,@last_clazz:=clazz	 -- 将clazz班级名全部复制一遍定义成一个新列
FROM
-- 下列查询得到的表为将两个表合并成一个表
	(SELECT 
		t1.*
		,t2.sum_sco
	FROM student t1
	JOIN (SELECT id,sum(score)as sum_sco FROM score GROUP BY id) t2
	ON t1.id = t2.id
	ORDER BY clazz DESC,sum_sco DESC) tt1 -- 先运行括号内的语句,此时已经先对每个班的班级和成绩排好序了,然后在对这整个表进行排名操作

再看结果:

此时可以看出每个班分别的排名情况。

解析代码:

        首先,通过 set @i:=0 设置变量 @i 的初始值为 0。这个变量会在后面的查询中被用来计算排名。
        接着,通过 set @last_clazz:='' 设置变量 @last_clazz 的初始值为。这个变量用于保存上一个班级的值,以便与当前班级进行比较。然后,开始执行查询语句。查询的主体部分是一个子查询 SELECT t1.*, t2.sum_sco FROM student t1 JOIN (SELECT id, sum(score) as sum_sco FROM score GROUP BY id) t2 ON t1.id = t2.id ORDER BY clazz DESC, sum_sco DESC。

        这个子查询首先从 student t1 表中选择所有字段,并与子查询 SELECT id,sum(score) as sum_sco FROM score GROUP BY id 进行连接。子查询的目的是计算每个学生的总分数 sum_sco。连接条件是 t1.id = t2.id,即 student 表的 id 字段与 score 表的 id 字段相等。
然后,查询结果按照 clazz 和 sum_sco 的降序进行排序

        @last_clazz:用于保存上一个班级的值,以便与当前班级进行比较。
        IF(clazz = @last_clazz, @i := @i + 1, @i := 1) as rank:根据当前班级是否与上一个班级相同,来更新排名。如果相同,则将 @i 的值加 1,表示同一班级中的下一个学生。如果不同,则将 @i 的值重置为 1,表示进入了新的班级。
        @last_clazz := clazz:将当前班级的值保存为 @last_clazz,以便在下一行计算排名时使用。

3、考虑同分排序

同样在上述代码的基础下再次对其进行操作:


set @i:=0; -- 记录正常顺序
set @last_clazz:=''; -- 记录是否同班级
set @last_sco:=0;  -- 记录是否同分
SELECT 
	* -- 此时可以打印输出想要的字段,然后重新使用select对这个表进行处理,取出想要的数据
	,@last_sco
	,@last_clazz
	,IF(clazz=@last_clazz,IF(sum_sco=@last_sco,@i,@i:=@i+1),@i:=1) as rank
-- 在对每个班排好名的情况下,再额外对其进行判断,如果分数相同,当前排名不动,反之继续增加排名
	,@last_clazz:=clazz
	,@last_sco:=sum_sco
FROM
	(SELECT  -- 合并两表,取出需要的字段
		t1.*
		,t2.sum_sco
	FROM student t1
	JOIN (SELECT id,sum(score)as sum_sco FROM score GROUP BY id) t2
	ON t1.id = t2.id
	ORDER BY clazz DESC,sum_sco DESC) tt1

运行结果如下所示,即同分排名一致,下列继续顺序排名

如果想要跳过同分这个排名,可以额外再定义一个变量,用来存放分数排名,如果分数一致,相同分数的排名同学一致,后面跳过当前顺序的排名,例如下图排名rank

        

简单修改代码为下列情况:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

datax和datax-web打包成docker运行

概述 datax和datax-web从一台机器迁移到另一台时,要重新搭建一套运行环境,比较麻烦;打包成docker镜像后迁移就方便多了; 因为我的mysql版本是8,需要在datax的read和write中手动添加8的jdbc驱动 所以我先各自下载好了datax和data…

JavaEE 的入门

1. 学习JavaEE Java EE(Java Platform Enterprise Edition), Java 平台企业版. 是JavaSE的扩展, ⽤于解决企业级的开 发需求, 所以也可以称之为是⼀组⽤于企业开发的Java技术标准. 所以, 学习JavaEE主要是学习Java在 企业中如何应⽤. 前⾯学习的是Java基础, JavaEE 主要学习Jav…

修改docker数据存储目录及拉取镜像安装oracle19c

一、修改docker数据目录,默认安装路径为/var/lib/docker 查看docker主路径 docker info |grep "Docker Root Dir"1.停服务 systemctl stop docker2.新建目录并授权 mkdir /data/docker -p chown -R root:docker /data/docker/3.修改配置文件 原有{}内…

微信小程序预览PDF、H5预览PDF、网页预览PDF,并添加专属文字水印

下载PDF.js 点击PDF.js下载地址 引入预览PDF 文件 // const url new URL("./1.pdf", import.meta.url).href // 在本地项目获取pdf // const url "https://xxxx/05d833041f.pdf" // 在线上链接获取pdf const url query.get(url) // 在地址栏获取pdf c…

2024年Q2震撼来袭!AMD数据中心与笔记本CPU市场独占鳌头,强劲表现引爆业界关注!

根据CPU市场追踪机构Mercury Research的最新报告,AMD在2024年第二季度再次取得了显著成绩,在数据中心和笔记本电脑CPU市场上份额有所增加。然而,Intel在台式机市场仍占据优势,并在整体出货量上保持领先地位。 在2024年第二季度&a…

本地查看的Git远程仓库分支与远程仓库分支数量不一致

说明:一次,在IDEA中想切换到某分支,但是查看Remote没有找到要切换的分支,但是打开GitLab,查看远程仓库,是有这个分支的。 解决:1)在IDEA的Git中,点下面Fatch获取一下远程…

Grype:用于容器镜像、文件系统的开源漏洞扫描程序

容器镜像和文件系统的漏洞扫描器 Grype 是一个开源漏洞扫描器,专为容器镜像和文件系统设计,可与强大的软件物料清单 (SBOM) 工具 Syft 无缝集成。 扫描容器镜像或文件系统的内容以查找已知漏洞。 查找主要操作系统软件包的漏洞 Alpine Amazon Linux B…

计算机毕业设计 招生宣传管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Linux基础入门---Centos安装步骤

😀前言 本篇博文是关于Centos的详细安装,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力&#x1f609…

20240814 每日AI必读资讯

号称全球最强AI程序员 “Genie” 横空出世,击败Devin与GPT-4! - Genie在SWE-Bench测试中得分高达30.08%,成为全球最强AI程序员。 - 采用特殊数据集和自我改进机制,使Genie在复杂编码中表现出色。 - 目前已开放申请试用,未来将推…

Android12 SystemUI QS面板新增截屏功能

问题:Android12 中SystemUI版本,QS下拉快捷面板式没有截屏功能的。 需求:客户要求在项目中实现下拉快捷面板具备一键截屏功能 目前自己只针对Android12 mtk/RK平台实践过,接触的全志平台暂未实验验证。 文章目录 前言一、实际实现效果二、修改点1.新增文件2.修改文件三、基…

Redis缓存——缓存更新策略和常见的缓存问题

一.什么是缓存? 前言:什么是缓存? 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码 前言:为什么要使用缓存? 一句话:因为速度快,好用 缓存数据存储于代码中,而代码运行在内存…

初识C++ · C++11(3)

前言: 本文介绍的是包装器以及线程库的简单了解,但是呢,线程是基于对Linux有一定的了解,所以本文就是简单介绍一下,介绍完包装器以及线程库的简单理解之后C11的特性就到此为止,当然C11远不止于此&#xff…

Pixel Adventure Unity2D开发完整指南

本文参考:2-2. Get and Setup Assets_哔哩哔哩_bilibili 1、下载资源 在Asset Store中下载Pix Adventure1 2的资源: 在import的时候,不用到Scene import进来,如下图所示,Scenes目录反勾选一下。 两个资源都下载完成后…

朱利亚集合和曼德布洛特集合及其图像

朱利亚集合和曼德布洛特集合及其图像 朱利亚集合(Julia Set)和 曼德布洛特集合(Mandelbrot Set)除了数学理论上的意义,所生成的分形图像,因其独特的几何美感和无限的复杂性,还被广泛应用于计算机…

增强现实系列—深入探索ARKit:平面检测、三维模型放置与增强现实交互

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

技术研究:Redis 实现消息队列

综述 我们先看看消息队列的消息存取到底有哪些需求吧: 需求1:消息保序:由于消费者是异步处理消息,但是消费者需要按照生产者发送消息的顺序来处理消息,避免后发送的消息被先处理了。 需求2:重复消息处理&…

【区块链+金融服务】河北股权交易所综合金融服务平台 | FISCO BCOS应用案例

区域性股权市场是我国资本市场的重要组成部分,是多层次资本市场体系的基石。河北股权交易所(简称:河交所) 作为河北省唯一一家区域性股权市场运营机构,打造河北股权交易所综合金融服务平台,将区块链技术与区…

信号与系统MATLAB实验:连续信号的采样与恢复

一、实验内容 (1)修改示例中的门信号宽度、采样周期等参数,重新运行程序,观察得到的采样信号时域和频域特性,以及重构信号与误差信号的变化。 示例1:选取门信号f(t) g2(t)为被采样信号。利用MATLAB实现对…

搭建超好用的个人网盘

目录 前言filebrowser下载地址介绍优点缺点部署效果 cloudreve官网介绍优点缺点部署效果 总结 前言 目前我使用过的文件存储管理软件,包括fastdfs、minio、filebrowser、cloudreve,这4款软件,我自己亲自搭建且都使用过,fastdfs很…