MySQL对window函数执行sum函数可能出现的一个Bug

作者:MyStitch 时间:2024-01-23 23:37:42 

使用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_ids_ids_scorefirst_vlast_vsum_vmax_vmin_vcount_vrow_idrank_iddense_id
010180808016080802111
010380808016080802211
010576807623680763332
010270807030680704443
010450805035680505554
010631803138780316665
02019090909090901111
020789908917990892222
020587908726690873333
020380908034690804444
020260906040690605555
020430903043690306666
03019999999999991111
030798999819799982222
030280998035799804333
030380998035799804433
030634993439199345554
030420992041199206665

思考验证

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

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

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

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

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


c_ids_ids_scorefirst_vlast_vsum_vmax_vmin_vcount_vrow_idrank_iddense_id
01018080828282822111
010380808016282802211
010576807623682763332
010270807030682704443
010450805035682505554
010631803138782316665
02019090909090901111
020789908917990892222
020587908726690873333
020380908034690804444
020260906040690605555
020430903043690306666
03019999999999991111
030798999819799982222
030280998035799804333
030380998035799804433
030634993439199345554
030420992041199206665

其他Sql验证和对比

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

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

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

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

来源:https://www.cnblogs.com/StitchSun/p/13267707.html

标签:mysql,函数,sum
0
投稿

猜你喜欢

  • 实现WordPress主题侧边栏切换功能的PHP脚本详解

    2024-06-05 09:23:40
  • Python深拷贝与浅拷贝用法实例分析

    2023-11-06 01:25:04
  • HTML中使背景图片自适应浏览器大小实例详解

    2024-05-02 16:18:32
  • 基于python-pptx库中文文档及使用详解

    2023-11-30 12:06:13
  • 对python条件表达式的四种实现方法小结

    2023-11-05 17:01:58
  • form表单的submit方法和submit事件

    2008-10-15 11:22:00
  • Python人工智能学习PyTorch实现WGAN示例详解

    2022-10-20 18:49:32
  • ElementUI日期选择器时间选择范围限制的实现

    2024-04-09 11:00:28
  • python 二维数组90度旋转的方法

    2021-05-18 20:16:19
  • Flask入门教程实例:搭建一个静态博客

    2022-08-12 10:17:38
  • Python合并多个Excel数据的方法

    2022-11-02 06:31:33
  • 20招让你的Python飞起来!

    2022-08-24 18:39:39
  • asp.net“服务器应用程序不可用” 解决方法

    2023-06-29 10:05:30
  • go-zero源码阅读之布隆过滤器实现代码

    2024-05-08 10:23:06
  • python取均匀不重复的随机数方式

    2022-07-06 15:28:02
  • SQL语句学习

    2024-01-18 15:07:00
  • Python3中configparser模块读写ini文件并解析配置的用法详解

    2022-11-02 12:11:14
  • MYSQL教程:查询优化之有效加载数据

    2009-02-27 15:45:00
  • JS模拟简易滚动条效果代码(附demo源码)

    2024-04-23 09:22:45
  • PyCharm使用最多也最常用默认快捷键分享

    2023-05-23 20:54:55
  • asp之家 网络编程 m.aspxhome.com