【MySQL】使用 CAST 函数处理 unsigned 相减错误(BIGINT UNSIGNED value is out of range)

力扣题

1、题目地址

2175. 世界排名的变化

2、模拟表

表:TeamPoints

Column NameType
team_idint
namevarchar
pointsint
  • team_id 包含唯一值。
  • 这张表的每一行均包含了一支国家队的 ID,它所代表的国家,以及它在全球排名中的得分。
  • 没有两支队伍代表同一个国家。

表:PointsChange

Column NameType
team_idint
points_changeint
  • team_id 包含唯一值。
  • 这张表的每一行均包含了一支国家队的 ID 以及它在世界排名中的得分的变化。

分数的变化分以下情况:

  • 0:代表分数没有改变
  • 正数:代表分数增加
  • 负数:代表分数降低

TeamPoints 表中出现的每一个 team_id 均会在这张表中出现。

3、要求

国家队的全球排名是按 降序排列 所有队伍的得分后所得出的排名。
如果两支队伍得分相同,我们将按其名称的 字典顺序 排列以打破平衡。

每支国家队的分数应根据其相应的 points_change 进行更新。

编写解决方案来计算在分数更新后,每个队伍的全球排名的变化。

以 任意顺序 返回结果。

查询结果的格式如下例所示:

示例 1:

输入:
TeamPoints 表:

team_idnamepoints
3Algeria1431
1Senegal2132
2New Zealand1402
4Croatia1817

PointsChange 表:

team_idpoints_change
3399
20
413
1-22

输出:

team_idnamerank_diff
1Senegal0
4Croatia-1
3Algeria1
2New Zealand0

解释:

世界排名如下所示:

team_idnamepointsrank
1Senegal21321
4Croatia18172
3Algeria14313
2New Zealand14024

在更新分数后,世界排名变为下表:

team_idnamepointsrank
1Senegal21101
3Algeria18302
4Croatia18303
2New Zealand14024

由于在更新分数后,Algeria 和 Croatia 的得分相同,因此根据字典顺序对它们进行排序。
Senegal 丢失了 22分 但他们的排名没有改变。
Croatia 获得了 13分 但是他们的排名下降了 1 名。
Algeria 获得 399分,排名上升了 1 名。
New Zealand 没有获得或丢失分数,他们的排名也没有发生变化。

4、代码编写

要求分析

首先根据要求查询出未更新前的排名

SELECT *, row_number() over (order by points desc, name) AS `rank`
FROM TeamPoints
| team_id | name        | points | rank |
| ------- | ----------- | ------ | ---- |
| 1       | Senegal     | 2132   | 1    |
| 4       | Croatia     | 1817   | 2    |
| 3       | Algeria     | 1431   | 3    |
| 2       | New Zealand | 1402   | 4    |

其次查询出更新后的排名

SELECT one.team_id, one.name,(one.points + two.points_change) AS points, row_number() over (order by (one.points + two.points_change) desc, one.name) AS `rank`
FROM TeamPoints oneLEFT JOIN PointsChange two USING(team_id)
| team_id | name        | points | rank |
| ------- | ----------- | ------ | ---- |
| 1       | Senegal     | 2110   | 1    |
| 3       | Algeria     | 1830   | 2    |
| 4       | Croatia     | 1830   | 3    |
| 2       | New Zealand | 1402   | 4    |

最后将两个SQL根据 team_id 进行连表,rank 相减即可(里面需要注意的点就是相减错误问题)

知识点

MySQL 当两个字段想减时,如果其中 一个或两个字段 的类型的 unsigned 无签名类型,
如果 差值 小于 0则会报错(BIGINT UNSIGNED value is out of range)

测试:

大于等于 0 的情况:

select cast(1 as unsigned) - 1
# 输入:0
select 2 - cast(1 as unsigned)
# 输入:1
select cast(2 as unsigned) - cast(1 as unsigned)
# 输入:1

小于 0 的情况:

select cast(1 as unsigned) - 2
# 报错:BIGINT UNSIGNED value is out of range in '(cast(1 as unsigned) - 2)'
select 0 - cast(1 as unsigned)
# 报错:BIGINT UNSIGNED value is out of range in '(0 - cast(1 as unsigned))'
select cast(1 as unsigned) - cast(2 as unsigned)
# 报错:BIGINT UNSIGNED value is out of range in '(cast(1 as unsigned) - cast(2 as unsigned))'

小于 0 的报错处理:

select cast(1 as signed) - 2
# 输出:-1
select 1 - cast(2 as signed)
# 输入:-1
  • 在两个值是 定值 的的情况,且是 差值是负数 的情况,
    直接使用 select cast(1 as signed) - 2select 1 - cast(2 as signed) 即可
  • 如果两个值都 不清楚 的情况,两个值 都得使用 cast(字段 as signed) 对值进行处理再相减(下面代码就是很好的例子)

参考:处理 unsigned 相减错误(BIGINT UNSIGNED value is out of range)

代码

SELECT a.team_id, a.name, (CAST(a.`rank` AS SIGNED) - CAST(b.`rank` AS SIGNED)) AS rank_diff
FROM (SELECT *, row_number() over (order by points desc, name) AS `rank`FROM TeamPoints
) AS a 
LEFT JOIN (SELECT one.team_id, one.name,(one.points + two.points_change) AS points, row_number() over (order by (one.points + two.points_change) desc, one.name) AS `rank`FROM TeamPoints oneLEFT JOIN PointsChange two USING(team_id)
) AS b USING(team_id)

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

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

相关文章

Mellanox Cumulus 10GB交换机 - 网卡接口配置成网桥

服务器上有一张网卡KVM虚拟机网桥,模拟出多套虚拟网桥 登陆交换机Mellanox Cumulus 第一步:创建桥 - 名称为bridge sudo brctl addbr bridge 第二步:添加接口至master bridge sudo brctl addif br0 swp17 启动master bridge接口 sudo …

软件需求规格说明书-word

软件需求规格说明书编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件开发全文档获取:软件项目开发全套文档下载_软件项目文档-CSDN博客

【JavaEE进阶】 图书管理系统开发日记——壹

文章目录 🌲序言🌴前端代码的引入🎋约定前后端交互接口🍃后端服务器代码实现🚩UserController.java🚩BookController.java ⭕总结 🌲序言 该图书管理系统,博主将一步一步进行实现。…

react中如何使用其他字体

找到一个.ttf字体文件放入到assets文件夹中在global.less文件中利用font-face全局注册使用:font-family: "YouSheBiaoTiHei";

Template -- Vue3

Vue3 版本 Node 21.6.0Npm 10.2.4 项目 创建 npm init vite 项目名称vuejsnpm inpm run dev 依赖 npm i element-plus # UI npm i axios # 网络 npm i vue-router4 # 路由 npm i vuexnext # 状态管理npm i sass -D …

Python之可迭代对象、迭代器、生成器

Python可迭代对象(Iterable) Python中经常使用for来对某个对象进行遍历,此时被遍历的这个对象就是可迭代对象,像常见的list,tuple都是。如果给一个准确的定义的话,就是只要它定义了可以返回一个迭代器的__iter__方法…

鸿蒙HarmonyOS应用开发者认证 题库+答案案

建议用手机和PC两台设备协助,一台考试,一台找答案 1.在Colum和Row容器组件中,justifycontent用于设置子组件在主轴方向上的对齐格式,alignItems用于设置子组件在交叉抽方向上的对齐格式。 正确(True) 2.Video组件可以支持本地视频…

linux开机自启动方法

服务开机自启 docker 开机自启方法 容器没有自启 执行一下 docker update --restartalways NAMES[容器名称]java 服务器开机自启方法 第一种:利用 rc.local 文件完成开机自启,vi /etc/rc.local #!/bin/bash # THIS FILE IS ADDED FOR COMPATIBILITY …

甜蜜而简洁——深入了解Pytest插件pytest-sugar

在日常的软件开发中,测试是确保代码质量的关键步骤之一。然而,对于测试报告的生成和测试结果的可读性,一直以来都是开发者关注的焦点。Pytest插件 pytest-sugar 以其清晰而美观的输出,为我们提供了一种愉悦的测试体验。本文将深入介绍 pytest-sugar 插件的基本用法和实际案…

css3 纯代码案例

css3 纯代码案例 前言渐变之美1.1 纯CSS3实现的渐变背景1.2 使用多重颜色和方向打造丰富渐变效果1.3 渐变色停留动画的巧妙运用 纯CSS图形绘制2.1 使用border属性制作三角形、梯形等形状伪类箭头图标2.2 利用transform创建旋转、缩放的图形 浮动的阴影敲代码css准备reset 样式复…

基于springboot+vue的图书个性化推荐系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Jupyter Notebook五分钟基础速通

1 作用 常用于数据分析 2 安装 2.1 Anaconda 通过直接安装Anaconda,会自动安装Jupyter Notebook 2.2 命令行安装 ① 3.x版本 pip3 install --upgrade pip pip3 install jupyter ② 2.x版本 pip install --upgrade pip pip install jupyter 3 启动 cmd窗口下…

Web3去中心化存储:重新定义云服务

随着Web3技术的崭露头角,去中心化存储正在成为数字时代云服务的全新范式。传统的云服务依赖于中心化的数据存储架构,而Web3的去中心化存储则为用户带来了更安全、更隐私、更可靠的数据管理方式,重新定义了云服务的未来。 1.摒弃中心化的弊端 …

c# 学习笔记 - 异步编程

文章目录 1. 异步编程介绍1.1 简单介绍1.2 async/await 使用1.3 Task/Task<TResult> 对象 2. 样例2.1 迅速启动所有任务&#xff0c;仅当需要结果才等待任务执行2.2 使用 await 调用异步方法&#xff0c;即使这个异步方法内有 await 也不会同时执行回调和向下执行操作(必…

Kali在Vmware无法连接到网络,配置网络及解决办法

一.问题描述&#xff1a; 打开 Kali&#xff0c;无法连接到网络&#xff0c;虚拟机配置正常的。 尝试 ping 百度&#xff0c;出错&#xff1a; ping baidu.com 提示&#xff1a; ping: baidu.com: Temporary failure in name resolution二.解决办法&#xff1a; 1.首先在vmwa…

工作流功能

在小程序、公众号的开发过程中&#xff0c;开发者经常遇到以下场景&#xff1a; 接收来自微信的服务端回调消息&#xff0c;例如公众号事件推送、微信支付付款回调等&#xff1b;运行定时任务&#xff0c;例如每天 0 点进行数据清理、统计等&#xff1b;进行任务逻辑编排&…

手机常用的root方案

手机常用的root方案 xposed Magisk KernelSU SuperSU 这些都是用于手机Root的工具或框架&#xff0c;它们之间有一些区别&#xff1a; Xposed Framework&#xff1a;Xposed是一个适用于Android设备的框架&#xff0c;允许用户在不修改APK文件的情况下对系统进行定制。它通…

Base64编码原理解析

文章目录 一、Base64Base64编码的原理如下&#xff1a;以字符串"hello world"为例&#xff0c;它的ASCII码为&#xff08;下面&#x1f447;是ASCII码对照表&#xff09;&#xff1a;将这些ASCII码转换为二进制&#xff08;对照上表&#xff09;&#xff1a;将上述二…

Flink的KeyedProcessFunction基于Event Time和Process Time的定时器用法实例分析

FLink处理函数简介 在Flink底层&#xff0c;我们可以不定义任何具体的算子&#xff08;比如 map&#xff0c;filter&#xff0c;或者 window&#xff09;&#xff0c;而只是提炼出一个统一的【处理】&#xff08;process&#xff09;操作——它是所有转换算子的一个概括性的表…

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

一键式Excel分词统计工具&#xff1a;如何轻松打包Python脚本为EXE 写在最前面需求分析直接用Python打包为什么大&#xff1f;为什么要使用conda环境&#xff1f; 将Python脚本打包为一个独立的应用程序1. 编写Python脚本&#xff1a;初步功能实现2. 初步图形用户界面&#xff…