MySQL 中使用变量实现排名名次

news2024/11/22 22:34:19
title: MySQL 中使用变量实现排名名次
date: 2023-7-16 19:45:26
tags:

- SQL 高级查询

一. 数据准备:

CREATE TABLE sql_rank (
	id INT ( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT,
	user_id INT ( 11 ) UNSIGNED NOT NULL,
	score TINYINT ( 3 ) UNSIGNED NOT NULL,
	add_time date NOT NULL,
	PRIMARY KEY ( id ) 
) ENGINE = INNODB CHARSET = latin1;

INSERT INTO sql_rank ( user_id, score, add_time )
VALUES
	( 100, 50, '2016-05-01' ),
	( 101, 30, '2016-05-01' ),
	( 102, 20, '2016-05-01' ),
	( 103, 60, '2016-05-01' ),
	( 104, 80, '2016-05-01' ),
	( 105, 50, '2016-05-01' ),
	( 106, 70, '2016-05-01' ),
	( 107, 85, '2016-05-01' ),
	(
		108,
	60,
	'2016-05-01');

二. 不管数据相同与否,排名依次排序(1,2,3,4,5,6,7,...)

思路: 将已经排序好的数据从第一条依次取出来,取一条就自增加一,实现从 1 到最后的一个排名

SELECT
	obj.user_id,
	obj.score,
	@rownum := @rownum + 1 AS rownum 
FROM
	( SELECT user_id, score FROM sql_rank ORDER BY score DESC ) obj,
	( SELECT @rownum := 0 ) r

img

三. 只要数据有相同的排名就一样,排名依次排序(1,2,2,3,3,4,5,...)

思路: 当出现相同的数据时,排名保持不变,此时则需要再设置一个变量,用来记录上一条数据的值,跟当前数据的值进行对比,如果相同,则排名不变,不相同则排名自增加 1

SELECT
	obj.user_id,
	obj.score,
CASE
		WHEN @prerow = obj.score THEN
		@currank 
		WHEN @prerow := obj.score THEN
		@currank := @currank + 1 
		WHEN @prerow = 0 THEN
		@currow := @currank + 1 
	END AS currank 
FROM
	( SELECT user_id, score FROM sql_rank ORDER BY score DESC ) obj,
	( SELECT @currank := 0, @prerow := NULL ) r

让我们逐行解释:

  1. WHEN @prerow = obj.score THEN @currank: 这行代码检查前一行的分数是否与当前行的分数相同。如果相同,则将当前的排名(@currank)赋值给当前行的排名。
  2. WHEN @prerow := obj.score THEN @currank := @currank + 1: 这行代码首先将当前行的分数赋值给@prerow变量,然后将当前排名(@currank)加1。
  3. WHEN @prerow = 0 THEN @currow := @currank + 1: 这行代码检查前一行的分数是否为0。如果是,则将当前排名(@currank)加1,并将结果赋值给@currow变量。
  4. END AS currank: 这行代码将计算得到的排名赋值给一个名为currank的列。

img

四. 当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是类似于(1,2,2,2,5)这种排名

思路: 当出现相同的数据时,排名保持不变,但是保持不变的排名依旧会占用一个位置,也就是类似于(1,2,2,2,5)这种排名就是属于中间的三个排名是一样的,但是第五个排名按照上面一种情况是(1,2,2,2,3),现在则是排名相同也会占据排名的位置

SELECT
	obj_new.user_id,
	obj_new.score,
	obj_new.rownum 
FROM
	(
	SELECT
		obj.user_id,
		obj.score,
		@curRank := @curRank + 1 AS num_tmp,
		@incrRank :=
	CASE
			
			WHEN @prevRecord = obj.score THEN
			@incrRank 
			WHEN @prevRecord := obj.score THEN
			@curRank 
		END AS rownum 
	FROM
		( SELECT user_id, score FROM `sql_rank` ORDER BY score DESC ) obj,
	( SELECT @curRank := 0, @prevRecord := NULL, @incrRank := 0 ) r 
	) obj_new

img

这时候就新增加了一个变量,用于记录上一条数据的分数了,只要当前数据分数跟上一条数据的分数比较,相同分数的排名就不变,不相同分数的排名就加一,并且更新变量的分数值为该条数据的分数,依次比较

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

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

相关文章

Spring Batch之读数据库—HibernateCursorItemReader(三十九)

一、HibernateCursorItemReader 对应关系映射(Object Relational Mapping,ORM)是一种为解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。 H…

html 解决css样式 缓存 ---css引入添加时间戳

通过js 对引入的css添加时间戳 <script type"text/javascript">document.write("<link relstylesheet typetext/css href./style/base.css?v" new Date().getTime() ">");document.write("<link relstylesheet typetext…

和chatgpt学架构03-引入UI框架(elment-plus)

目录 1 项目目录及文件的具体作用1.1 App.vue1.2 main.js的作用1.3 main.js什么时候被调用1.4 npm run serve干了什么事情1.5 package.json的作用 2 安装UI框架2.1 安装命令2.2 全局引入 3 启动工程总结 我们已经安装好了我们的vue脚手架&#xff0c;用vscode打开工程目录 要自…

有序链表转换二叉搜索树

给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,nul…

封装hiredis成dll包,为老项目提供redis网络支持

第一步&#xff1a;准备VS环境 1、需要下载window8.1的SDK否则无法下载 2、平台工具集需要使用Visual Studio 2015(v140) 第二步&#xff1a;下载hiredis 去microsoft/hiredis下载windows版本的hiredis&#xff0c;并解压到本地 打开hiredis-master\msvs\vs-solutions中的sl…

linux之Ubuntu系列 find 、 ln 、 tar、apt 指令 软链接和硬链接 snap

查找文件 find 命令 功能非常强大&#xff0c;通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 &#xff0c;正则表达式 包括子目录 ls 不包括 子目录 如果省略路径&#xff0c;表示 在当前路径下&#xff0c;搜索 软链接…

GPT 如此强大,我们可以利用它实现什么?

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer结构的预训练语言生成模型&#xff0c;由OpenAI研发。它可以生成高质量的自然语言文本&#xff0c;取得了很好的效果&#xff0c;被广泛应用于各个领域。以下是一些利用GPT实现的应用。 一…

01-复杂度1 最大子列和问题

中国大学MOOC-陈越、何钦铭-数据结构-2023夏季 题目集 题目 思路 令f(n)表示以第n个数结尾的连续序列的最大和&#xff0c;则状态转移方程为&#xff1a; 解释&#xff1a;如果f(n-1)小于零&#xff0c;代表对f(n)的值贡献为负。故&#xff0c;以为结尾的最大子列和就是&…

【Hydro】一个简单的HBV水文模型产流Python实现

说明 HBV模型包括一系列自由参数&#xff0c;其值可以通过率定得到。同时也包括一些描述流域和气候特征的参数&#xff0c;它们的值在模型率定是假定不变。子流域的划分使得在一个子流域中可能有很多参数值。虽然在大多数应用中&#xff0c;各子流域之间参数值只有很小的变化&a…

【已解决】idea使用debug启动一直卡着不动

debug启动时一直卡着不动出现下图提示&#xff0c;但是正常启动又可以启动 翻译结果是&#xff1a;方法断点可能会大大降低调试速度。很明显&#xff0c;有断点的位置没加对或者误加断点了&#xff0c;以下是解决方法。 打开 .idea文件夹&#xff0c;找到workspace.xml文件 找…

基于Javaweb实现ATM机系统开发实战(九)存款功能实现

先看前端界面确定后端需要处理的参数&#xff0c;把一些参数进行修改&#xff1a; <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri"http://java.sun.com…

JavaScript运算符优先顺序

● 我们可以通过MDN去查看运算符的优先级 ● 可以看到运算符是从左到右还是从右到左进行运算的&#xff1b; let x, y; x y 25 - 10 - 5; console.log (x, y);上面的运算会现实10 10&#xff0c;为什么会得到这样的结果呢&#xff1f;因为你查看mdn那个表你会发现&#xf…

使用Jquery为页面添加元素,并设置元素的背景图片时,背景图总会延迟几秒才会出现的问题

介绍 使用 jquery&#xff0c;为页面添加元素时&#xff0c;同时动态设置元素的背景图&#xff0c;总是会导致背景图延迟几秒才会出现&#xff0c;如下图所示&#xff1a; 解决方式 创建一个 image 对象&#xff0c;定义 image 对象的 src 属性&#xff1b;在 image 对象的 o…

Linux搭建node环境-MobaXterm+node+pm2安装

1.登录session 2.安装X11-forwarding 我也不知道这个有什么用&#xff0c;但是有个叉叉在那里有点难受&#xff0c;就把它解决了什么是X11-forwarding&#xff1f;怎么使用&#xff1f; yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Ty…

软件架构介绍

一、定义 软件架构&#xff1a;可以简单理解为满足干系人关键诉求的一系列宏观决策。 二、软件质量属性 软件架构师大部分时间在解决以下产品质量模型中的质量属性问题。 三、程序员和架构师区别 从思维逻辑方面来看&#xff0c; 程序员从功能和业务逻辑方面去想问题。 架…

​大华智慧园区综合管理平台存在任意文件上传漏洞

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 大华智慧园区综合管理平台简介 大华智慧园区综合管理…

HTML5学习简记

目录 HTML定义 标签 HTML基本骨架 常见标签 标题标签 段落标签 换行与水平线标签 文本格式化标签 图像标签 绝对路径与相对路径 超链接标签 音频与视频标签 列表标签 无序列表 有序列表 定义列表 表格标签 表格结构标签 合并单元格 表单标签 input标签 input标签占…

前端工程化第一章:webpack5基础(上)

文章目录 1. 什么是webpack&#xff1f;2. webpack使用2.2. 前置知识2.1. 创建一个项目 3. webpack打包3.1. 创建一个webpack.config.js文件3.2. 入口&#xff08;entry&#xff09;3.2.1. webpack.config.js3.2.2. src/index.js3.2.3. package.json 3.3. 输出&#xff08;outp…

SpringMvc异常处理机制

预期异常和运行异常&#xff0c;前者通过捕获&#xff0c;后者通过规范代码开发、测试等手段减少发生概率。 系统dao层、service层、controller层出现都可通过throws Exception向上抛出&#xff0c;最终由SpringMvc前端控制器交由异常处理器进行异常处理。 SpringMvc项目异常处…

有必要买apple pencil吗?ipad触控笔推荐平价

科技的飞速发展改变了人们的生活。在各种电子、数码产品不断涌现的今天&#xff0c;这款能与平板电脑相匹配的电容笔就应运而生了。随着国内的电容笔技术的进步&#xff0c;它的使用领域也在不断地扩展&#xff0c;逐渐开始取代苹果原装电容笔。下面&#xff0c;我将为大家介绍…