iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MySQL 对window函数执行sum函数疑似Bug
  • 296
分享到

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

MySQL对window函数执行sum函数疑似Bug 2020-12-26 04:12:57 296人浏览 绘本
摘要

Mysql 对window函数执行sum函数疑似Bug 使用mysql的窗口函数统计数据时,发现一个小的问题,与大家一起探讨下。 环境配置: mysql-installer-commUnity-8.0.20.0 问题点:在su

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

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

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

环境配置:

问题点:在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函数结合使用时的特性导致的。欢迎一起讨论和研究。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 对window函数执行sum函数疑似Bug

本文链接: https://www.lsjlt.com/news/7044.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Mysql——SUM()函数
    目录 一、前期准备工作 新建表如下: 插入的数据如下: 二、SUM()函数的用法  1.求和,返回指定列的总和 SUM 函数可以对单个列求和,也可以对多个列运算后求和,计算中忽略 NULL 值 SUM函数与分组 GROUP  BY 使用,可...
    99+
    2023-08-31
    mysql 数据库 sql java
  • MySQL窗口函数(MySQL Window Functions)
           MySQL从8.0开始支持窗口函数(Window Functions),因其经常被用在数据分析的场景,窗口函数也被称为分析函数(Analytic Functions)。 目录 一、窗口函数概念 二、基础语法 ...
    99+
    2023-09-01
    数据库
  • PHP-代码执行函数-命令执行函数
    目录 代码执行函数: 1.eval()函数 2.assert()  函数 3.call_user_func()函数  4- create_function()函数  5- array_map()函数 6- call_user_func_ar...
    99+
    2023-09-09
    php 开发语言 网络安全
  • mysql中sum()函数如何用
    本篇内容主要讲解“mysql中sum()函数如何用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql中sum()函数如何用”吧! ...
    99+
    2024-04-02
  • Mysql似oracle分析函数sum over的实现方法是什么
    这篇文章主要介绍“Mysql似oracle分析函数sum over的实现方法是什么”,在日常操作中,相信很多人在Mysql似oracle分析函数sum over的实现方法是什么问题上存在疑惑,小编查阅了各式...
    99+
    2024-04-02
  • python函数专讲:exec执行函数
    今天的Python学习教程想跟大家说一下exec执行函数...
    99+
    2023-06-02
  • 我们如何使用 MySQL SUM() 函数?
    MySQL SUM 函数用于计算多条记录中某个字段的总和。要理解 SUM() 函数,请考虑一个“employee_tbl”表,该表具有以下记录 -mysql> SELECT * FROM employee_tbl; +----...
    99+
    2023-10-22
  • 如何在MySQL中使用sum函数
    这篇文章将为大家详细讲解有关如何在MySQL中使用sum函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。语法分析SUM([DISTINCT] expr) [over_clause]Retu...
    99+
    2023-06-14
  • PHP常见的命令执行函数与代码执行函数
    目录 代码执行函数: 1. eval() GET和POST传参的区别  2. assert() 3. call_user_func() 4. create_function() 5. array_map() 6. call_user_fun...
    99+
    2023-09-05
    php 网络安全 web安全
  • 如何从共享对象(.so)执行函数
    学习Golang要努力,但是不要急!今天的这篇文章《如何从共享对象(.so)执行函数》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!...
    99+
    2024-04-04
  • 哪些 MySQL 函数的工作方式与 LOCATE() 函数类似?
    MySQL INSTR() 和 POSITION() 函数的工作方式与 LOCATE() 函数类似。它们都是 LOCATE() 函数的同义词。INSTR() 函数还返回从字符串中搜索后子字符串第一次出现的位置。 INSTR() 的语法如下 ...
    99+
    2023-10-22
  • python使用sum函数进行求和计算
    在python中使用sum()函数进行求和计算的方法sum:sum()函数的作用是对序列进行求和计算。sum()函数语法:sum(iterable[, start])sum()函数使用方法:>>>sum([0,1,2]) 3 >>> sum...
    99+
    2024-04-02
  • python中关于对super()函数疑问解惑
    目录案例一:运行下面的代码结果是什么?案例二:运行下面的代码结果是什么?案例三、更复杂些的继承,和上面的同理总结案例一:运行下面的代码结果是什么? class Person: ...
    99+
    2024-04-02
  • PHP命令执行的函数
    在做面试题的时候发现,自己对PHP命令执行的函数的了解并不是很全面,就想这去学习一下。我也在网上找到了许多的资料,在这里我就相当于一个总结吧。 system(); System()函数的主要功能是在系统权限允许的情况是执行系统命令,w...
    99+
    2023-09-15
    linux 运维 服务器
  • 使用 onclick 执行 PHP 函数
    我们还将介绍另一种使用 jQuery 库通过 onclick() 事件执行 PHP 函数的方法。该方法调用一个 JavaScript 函数,该函数将在网页中输出 PHP 函数的内容。 我们还将演示另...
    99+
    2024-02-27
  • 使用PHP的array_map()函数对数组中的每个元素执行回调函数
    使用PHP的array_map()函数对数组中的每个元素执行回调函数PHP是一种广泛应用于Web开发的脚本语言,拥有丰富的内置函数和方法。其中,array_map()函数是一个非常有用的函数,可以用于对数组中的每个元素执行回调函数,并返回处...
    99+
    2023-11-04
    PHP array_map() 回调函数
  • CWnd::AssertValid()函数执行出错
    CWnd::AssertValid()函数是MFC框架中的一个成员函数,用来检测CWnd对象是否有效。当调用该函数时,如果检测到CW...
    99+
    2023-08-23
    出错
  • PHP中的array_walk()函数:如何对数组中的每个元素执行回调函数
    PHP中的array_walk()函数:如何对数组中的每个元素执行回调函数在PHP中,数组是一种常用的数据结构,经常需要对数组中的每个元素进行特定操作。array_walk()函数可以帮助我们实现这个目标。本文将介绍array_walk()...
    99+
    2023-11-03
    PHP 回调函数 array_walk 数组元素执行
  • MySQL多行合并--GROUP_CONCAT函数,转换json数组--JSON_ARRAY() 函数,转换json对象--json_object()函数
    GROUP_CONCAT: 多行合并 在表设计中,一个字段可能会对应多条数据,但在有的查询场景下,需要实现将多行数据合并成一行数据,在MySQL中可以使用GROUP_CONCAT函数来实现 idpidname21篮球31足球 ...
    99+
    2023-09-03
    sql mysql java Powered by 金山文档
  • JavaScript立即执行函数与函数劫持的作用
    目录一、立即执行函数1、实现方式2、立即执行函数的作用3、使用场景4、返回值5、带单目运算符的立即执行函数二、函数劫持一、立即执行函数 立即执行函数(IIFE):在函数声明后立即调用...
    99+
    2023-01-11
    JS立即执行函数 JS函数劫持
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作