预先警告:我是 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/