溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL對window函數(shù)執(zhí)行sum函數(shù)會出現(xiàn)什么BUG

發(fā)布時間:2020-07-11 10:51:05 來源:億速云 閱讀:210 作者:清晨 欄目:開發(fā)技術(shù)

小編給大家分享一下MySQL對window函數(shù)執(zhí)行sum函數(shù)會出現(xiàn)什么BUG,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

使用MySql的窗口函數(shù)統(tǒng)計數(shù)據(jù)時,發(fā)現(xiàn)一個小的問題,與大家一起探討下。

環(huán)境配置:

  • mysql-installer-community-8.0.20.0
     

問題點:在sum對window函數(shù)執(zhí)行時,如果有重復數(shù)據(jù),會直接把相同的數(shù)據(jù)相加,并不是逐步相加。

問題描述

數(shù)據(jù):在一個成績表中,有三個個字段:學生s_id,課程c_id,成績s_score。

查詢條件查詢每個課程的學生成績排名和成績匯總。

查詢結(jié)果:發(fā)現(xiàn)如果同一個課程有相同成績是,匯總成績不是累加的,而是一次全部加上去。

創(chuàng)建數(shù)據(jù)表

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

插入數(shù)據(jù)

-- 成績表數(shù)據(jù)
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);

查詢數(shù)據(jù)

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);

查詢結(jié)果

看課程號01的統(tǒng)計結(jié)果,數(shù)據(jù)第一行的sum_v列,前兩個數(shù)據(jù)都是160,按照函數(shù)原理,數(shù)據(jù)應(yīng)該是80,160。

看課程號02的統(tǒng)計結(jié)果,發(fā)現(xiàn)結(jié)果是正確的,sum_v的第一個為90,第二個為179。

實際顯示與預期結(jié)果不一致,哪里出了問題。

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的數(shù)據(jù)正確,01的不正確,01與02的區(qū)別是01課程的前兩個學生成績一樣都是80。

難道是成績一樣,導致sum時出錯了。

為了驗證這個問題,把課程號01,學號為01的成績修改為82,然后在執(zhí)行查詢,結(jié)果如下

發(fā)現(xiàn)sum_v列顯示的為82、162,與預期結(jié)果一致。

這樣可以得出結(jié)論,在sum對window函數(shù)執(zhí)行時,如果有重復數(shù)據(jù),會直接把相同的數(shù)據(jù)相加,并不是逐步相加。

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驗證和對比

經(jīng)過上述驗證,Mysql在sum時確實出現(xiàn)了錯誤,不是逐步累加的。

其他平臺是否同樣存在問題,在Sqlite Expert 5.3版本驗證了下,發(fā)現(xiàn)結(jié)果一樣。

這個就奇怪了,如果是Mysql在實現(xiàn)時出錯,Sqlite出同樣錯誤的幾率小很多。

看完了這篇文章,相信你對MySQL對window函數(shù)執(zhí)行sum函數(shù)會出現(xiàn)什么BUG有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI