mysql - 找到比以前的增长

标签 mysql sql

预先警告:我是 MySQL 的新手,所以期待愚蠢的后续问题。

我正在编写一个跟踪学生考试成绩的应用程序。每个学生将在不同时间参加多次考试。我希望能够计算同一学生两次连续考试之间考试成绩的变化。这是我的表的基本结构...

--------------------------------------------
| score_id | student_id |   date   | score |
--------------------------------------------
|         1|           1| 2011-6-1 |    15 |
|        21|           1| 2011-8-1 |    16 |
|       342|           1| 2012-3-1 |    18 |
|         4|           2| 2011-6-1 |    21 |
|        16|           2| 2011-8-1 |    20 |
|       244|           2| 2012-3-1 |    20 |
--------------------------------------------

我想从我的查询中返回的是...

---------------------
| score_id | growth |
---------------------
|         1|    NULL|
|        21|       1|
|       342|       2|
|         4|    NULL|
|        16|      -1|
|       244|       0|
---------------------

这是一个与上一个问题类似的问题 here , 但日期并不总是彼此相隔的特定时间。

最佳答案

如果每个学生的分数 id 是连续的,那么一个简单的连接就可以:

select s.score_id, s.score - sprev.score
from scores s left outer join
     scores sprev
     on s.student_id = sprev.student_id and
        s.score_id = sprev.score_id + 1;

不过,如果输入数据真的如此排序,我会感到惊讶。在这种情况下,您需要找到以前的学生成绩。我认为相关子查询是最清晰的写法:

select score_id, score - prevscore
from (select s.*,
             (select score
              from scores s2
              where s.student_id = s2.student_id and
                    s.date > s2.date
              order by date desc
              limit 1
             ) as prevscore
      from scores s
     ) s

关于mysql - 找到比以前的增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17471068/

相关文章:

MySQL 触发器更新前错误(错误代码 : 1054. 'workflow_id' 中的未知列 'NEW' )

php - 选择具有不同放置可能组合的字段值

SQL Management Studio 设置(静默安装)

mysql - 在 MySQL 中实现复杂查询

android - 从 mysql 检索数据时应用程序崩溃

mysql - 比较 mySql 中的版本

mysql - sonarqube 4.5.2->5.3 数据库迁移失败

php - sql查询有时有效,有时无效

mysql - 如何修复 "Too many keys specified; max 1 keys allowed"错误?

sql - 如何在 Microsoft Azure SQL 数据库中安排 SQL 作业?