我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 对window函数执行sum函数疑似Bug

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 对window函数执行sum函数疑似Bug

MySQL 对window函数执行sum函数疑似Bug

MySQL 对window函数执行sum函数疑似Bug

使用MySql的窗口函数统计数据时,发现一个小的问题,与大家一起探讨下。

环境配置:

  • mysql-installer-community-8.0.20.0

问题点:在sum对window函数执行时,如果有重复数据,会直接把相同的数据相加,并不是逐步相加。

问题描述

数据:在一个成绩表中,有三个个字段:学生s_id,课程c_id,成绩s_score。

查询条件查询每个课程的学生成绩排名和成绩汇总。

查询结果:发现如果同一个课程有相同成绩是,汇总成绩不是累加的,而是一次全部加上去。

创建数据表

CREATE TABLE `Score`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMARY KEY(`s_id`,`c_id`)
)

插入数据

-- 成绩表数据
insert into Score values("01" , "01" , 80);
insert into Score values("01" , "02" , 90);
insert into Score values("01" , "03" , 99);
insert into Score values("02" , "01" , 70);
insert into Score values("02" , "02" , 60);
insert into Score values("02" , "03" , 80);
insert into Score values("03" , "01" , 80);
insert into Score values("03" , "02" , 80);
insert into Score values("03" , "03" , 80);
insert into Score values("04" , "01" , 50);
insert into Score values("04" , "02" , 30);
insert into Score values("04" , "03" , 20);
insert into Score values("05" , "01" , 76);
insert into Score values("05" , "02" , 87);
insert into Score values("06" , "01" , 31);
insert into Score values("06" , "03" , 34);
insert into Score values("07" , "02" , 89);
insert into Score values("07" , "03" , 98);

查询数据

select c_id,s_id,s_score,
first_value(s_score) over w as first_v,
last_value(s_score) over w as last_v,
sum(s_score) over w as sum_v,
max(s_score) over w as max_v,
min(s_score) over w as min_v,
count(s_id) over w as count_v,
row_number() over w as  row_id,
rank() over w as  rank_id,
dense_rank() over w as  dense_id
from score window w as (partition by c_id order by s_score desc);

查询结果

看课程号01的统计结果,数据第一行的sum_v列,前两个数据都是160,按照函数原理,数据应该是80,160。

看课程号02的统计结果,发现结果是正确的,sum_v的第一个为90,第二个为179。

实际显示与预期结果不一致,哪里出了问题。

c_id s_id s_score first_v last_v sum_v max_v min_v count_v row_id rank_id dense_id
01 01 80 80 80 160 80 80 2 1 1 1
01 03 80 80 80 160 80 80 2 2 1 1
01 05 76 80 76 236 80 76 3 3 3 2
01 02 70 80 70 306 80 70 4 4 4 3
01 04 50 80 50 356 80 50 5 5 5 4
01 06 31 80 31 387 80 31 6 6 6 5
02 01 90 90 90 90 90 90 1 1 1 1
02 07 89 90 89 179 90 89 2 2 2 2
02 05 87 90 87 266 90 87 3 3 3 3
02 03 80 90 80 346 90 80 4 4 4 4
02 02 60 90 60 406 90 60 5 5 5 5
02 04 30 90 30 436 90 30 6 6 6 6
03 01 99 99 99 99 99 99 1 1 1 1
03 07 98 99 98 197 99 98 2 2 2 2
03 02 80 99 80 357 99 80 4 3 3 3
03 03 80 99 80 357 99 80 4 4 3 3
03 06 34 99 34 391 99 34 5 5 5 4
03 04 20 99 20 411 99 20 6 6 6 5

思考验证

课程号02的数据正确,01的不正确,01与02的区别是01课程的前两个学生成绩一样都是80。

难道是成绩一样,导致sum时出错了。

为了验证这个问题,把课程号01,学号为01的成绩修改为82,然后在执行查询,结果如下

发现sum_v列显示的为82、162,与预期结果一致。

这样可以得出结论,在sum对window函数执行时,如果有重复数据,会直接把相同的数据相加,并不是逐步相加。

c_id s_id s_score first_v last_v sum_v max_v min_v count_v row_id rank_id dense_id
01 01 80 80 82 82 82 82 2 1 1 1
01 03 80 80 80 162 82 80 2 2 1 1
01 05 76 80 76 236 82 76 3 3 3 2
01 02 70 80 70 306 82 70 4 4 4 3
01 04 50 80 50 356 82 50 5 5 5 4
01 06 31 80 31 387 82 31 6 6 6 5
02 01 90 90 90 90 90 90 1 1 1 1
02 07 89 90 89 179 90 89 2 2 2 2
02 05 87 90 87 266 90 87 3 3 3 3
02 03 80 90 80 346 90 80 4 4 4 4
02 02 60 90 60 406 90 60 5 5 5 5
02 04 30 90 30 436 90 30 6 6 6 6
03 01 99 99 99 99 99 99 1 1 1 1
03 07 98 99 98 197 99 98 2 2 2 2
03 02 80 99 80 357 99 80 4 3 3 3
03 03 80 99 80 357 99 80 4 4 3 3
03 06 34 99 34 391 99 34 5 5 5 4
03 04 20 99 20 411 99 20 6 6 6 5

其他Sql验证和对比

经过上述验证,Mysql在sum时确实出现了错误,不是逐步累加的。

其他平台是否同样存在问题,在Sqlite Expert 5.3版本验证了下,发现结果一样。

这个就奇怪了,如果是Mysql在实现时出错,Sqlite出同样错误的几率小很多。

难道是sum和window函数结合使用时的特性导致的。欢迎一起讨论和研究。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 对window函数执行sum函数疑似Bug

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 对window函数执行sum函数疑似Bug

MySQL 对window函数执行sum函数疑似Bug使用MySql的窗口函数统计数据时,发现一个小的问题,与大家一起探讨下。环境配置:mysql-installer-community-8.0.20.0问题点:在sum对window函数执行时,如果有重复数据
MySQL 对window函数执行sum函数疑似Bug
2020-12-26

如何从共享对象(.so)执行函数

学习Golang要努力,但是不要急!今天的这篇文章《如何从共享对象(.so)执行函数》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!问题内容我有一个从 c 代码生成的 .so
如何从共享对象(.so)执行函数
2024-04-04

使用PHP的array_map()函数对数组中的每个元素执行回调函数

使用PHP的array_map()函数对数组中的每个元素执行回调函数PHP是一种广泛应用于Web开发的脚本语言,拥有丰富的内置函数和方法。其中,array_map()函数是一个非常有用的函数,可以用于对数组中的每个元素执行回调函数,并返回处
使用PHP的array_map()函数对数组中的每个元素执行回调函数
2023-11-04

PHP中的array_walk()函数:如何对数组中的每个元素执行回调函数

PHP中的array_walk()函数:如何对数组中的每个元素执行回调函数在PHP中,数组是一种常用的数据结构,经常需要对数组中的每个元素进行特定操作。array_walk()函数可以帮助我们实现这个目标。本文将介绍array_walk()
PHP中的array_walk()函数:如何对数组中的每个元素执行回调函数
2023-11-03

使用PHP的array_walk_recursive()函数对多维数组中的每个元素执行回调函数

PHP中的array_walk_recursive()函数可以对多维数组中的每个元素进行遍历,并调用指定的回调函数对其进行操作。本文将通过具体的代码示例来演示如何使用该函数。首先,让我们创建一个多维数组,用于演示array_walk_rec
使用PHP的array_walk_recursive()函数对多维数组中的每个元素执行回调函数
2023-11-04

PHP 函数的参数传递顺序对执行有影响吗?

对于 php 函数,传递参数的顺序会影响某些函数的执行。这适用于以下函数:str_split():用于拆分字符串,需要按顺序传递参数(字符串、长度)。shuffle():用于随机排序数组,需要按顺序传递参数(数组)。sort():用于升序排
PHP 函数的参数传递顺序对执行有影响吗?
2024-04-18

goroutine对golang函数的执行流程有什么影响?

go 中的 goroutine 实现并发,可让函数并发执行,通过通道实现通信,并提供对并发的控制。goroutine 的使用可提升程序性能,尤其适用于处理阻塞任务。示例代码展示了 goroutine 的并行执行、通道通信和并发控制。Go 程
goroutine对golang函数的执行流程有什么影响?
2024-05-04

Mysql中自定义函数的创建和执行方式

目录mysql自定义函数的创建和执行1.创建表,插入数据2.创建函数3.执行函数:select 函数名(参数值);Mysql自定义函数创建失败问题案例总结Mysql自定义函数的创建和执行假设students表中包含id和name两个字段,
2023-03-10

golang管道通信对函数执行效率的影响分析

管道通信对 golang 函数效率的影响取决于:管道缓冲大小:较大的缓冲区提高效率,但增加内存消耗。管道并发程度:较高的并发程度提高效率,但增加 cpu 使用率。Golang 管道通信对函数执行效率的影响分析在 Golang 中,管道是一
golang管道通信对函数执行效率的影响分析
2024-05-02

mysql对以逗号分隔的字段内容进行查询——find_in_set函数或locate函数

mysql对以逗号分隔的字段内容进行查询 find_in_set函数 背景 使用mysql时,有可能一个字段代表一个集合,如果将这个集合单独抽成一张表又不值当的,这个时候我们存储时,可以选择用逗号将数据分隔开(只能用英文的逗号),如图所示:
2023-08-19

Mysql中自定义函数的创建和执行方法是什么

本文小编为大家详细介绍“Mysql中自定义函数的创建和执行方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql中自定义函数的创建和执行方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Mys
2023-03-13

当没有匹配行时,如何将 MySQL SUM() 函数的输出自定义为 0 而不是 NULL?

我们知道,如果没有匹配的行,SUM() 函数将返回 NULL,但有时我们希望它返回零而不是 NULL。为此,我们可以使用 MySQL COALESCE() 函数,该函数接受两个参数,如果第一个参数为 NULL,则返回第二个参数,否则返回第一
2023-10-22

MySQL SUM() 函数如何评估它是否与返回不匹配行的 SELECT 语句一起使用?

当 MySQL SUM() 函数与没有返回匹配行的 SELECT 语句一起使用时,则没有任何内容可评估,并且它返回 NULL 作为输出。有时,我们认为它必须返回 0 作为输出,但 0 本身就是一个数字,对于没有匹配的行,返回 0 并不重要,
2023-10-22

在多行插入的情况下,对 MySQL LAST_INSERT_ID() 函数的输出有何影响?

众所周知,MySQL LAST_INSERT_ID() 函数返回最新生成的序列号,但在多行插入的情况下,它将返回由最前面插入的行生成的序列号。 示例mysql> Insert into Student(Name) values(Ram),(
2023-10-22

编程热搜

目录