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

标签 mysql sql database

我有一个学生考试数据的数据库,类似于下面显示的数据库。我试图通过一个学期(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/

相关文章:

sql - 有没有更好的方法从 hh :mm:ss to hhmmss? 转换 SQL 日期时间

java - 如何获取两列的值并存入ArrayList

mysql - 如何查找具有唯一值的所有行的总和

jquery - 即时搜索是否需要大量计算能力?

mysql - 选择单个最大值

java - 当 “parent” 表具有复合 PK 时,如何在 JPA 中建模一对多关系?

ios - NSPredicate 搜索出现 NSDate 错误

mysql - 为什么在 hh/mm/ss 不同的日期之间 Sequelize 返回空

mysql - 计算每天按另一个字段分组的行数

php - 从数据库中获取两个日期之间的数据