gpt4 book ai didi

MySQL 通过对一组值取一列的总和来对表进行排序

转载 作者:行者123 更新时间:2023-11-29 13:30:54 24 4
gpt4 key购买 nike

我有一个学生考试数据的数据库,类似于下面显示的数据库。我试图通过一个学期(Sem)所有科目(Subj)的Marks总和来为这些学生分配排名 )并相应地对它们进行排序。

所以如果这是原始数据库:

    Name | S.NO.| Subj | Sem | Marks | Rank
ab | B1 | C1 | 1 | 002 |
ab | B1 | C2 | 1 | 004 |
ab | B1 | C3 | 1 | 005 |
ab | B1 | C4 | 2 | 008 |

xy | C2 | C1 | 1 | 006 |
xy | C2 | C2 | 1 | 004 |
xy | C2 | C3 | 2 | 007 |
xy | C2 | C4 | 2 | 009 |
xy | C2 | C5 | 2 | 003 |

sm | Z1 | C1 | 1 | 006 |
sm | Z1 | C2 | 2 | 004 |
sm | Z1 | C3 | 2 | 008 |

我想将其转换为:

    Name | S.NO.| Subj | Sem | Marks | Rank
ab | B1 | C1 | 1 | 002 | 1(coz his total is 11 in sem 1)
ab | B1 | C2 | 1 | 004 | 1
ab | B1 | C3 | 1 | 005 | 1

ab | B1 | C4 | 2 | 008 | 3

xy | C2 | C1 | 1 | 006 | 2
xy | C2 | C2 | 1 | 004 | 2

xy | C2 | C3 | 2 | 007 | 1(coz his total is 19 in Sem 2)
xy | C2 | C4 | 2 | 009 | 1
xy | C2 | C5 | 2 | 003 | 1

sm | Z1 | C1 | 1 | 006 | 3

sm | Z1 | C2 | 2 | 004 | 2
sm | Z1 | C3 | 2 | 008 | 2

数据库大约有 300k 行。

最佳答案

这就是你想要的

select name,sno,subj,sem,mark,rank
from
(
select e1.*
, @sm:=(select sum(e2.mark) from exams e2 where e1.name=e2.name and e1.sem=e2.sem) summark
, case when @sem!=sem then @r:=1
when @s !=@sm then @r:=@r+1
else @r
end as rank
, @s:=@sm
, @sem:=sem
from exams e1,(select @r:=0, @s:=0,@sm:=0,@sem:=0) r
order by sem,summark desc
) r2
order by sno,subj;

我不知道运行时。也许需要一点时间。

SQL Fiddle 演示:http://sqlfiddle.com/#!9/b0290/1

稍微解释一下上面的内容。 MySQL不像其他数据库(例如Oracle)那样具有分析功能。但上面是模拟的。 @sm是分数的总和。 @r 是排名变量。如果分数总和发生变化,则分数会增加。当学期改变时它会重置为 1。 @s 保存前一行的总和,@sem 保存前一行的学期。

关于MySQL 通过对一组值取一列的总和来对表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19468182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com