我有这样的数据
student_id phase date
34 submitted 05-03-2019
34 review 15-04-2019
78 submitted 06-12-2018
34 submitted 25-04-2019
78 review 01-01-2019
34 review 08-05-2019
我想要的是这样的东西
student_id GapDays submission-date reviewdate
34 41 05-03-2019 15-04-2019
34 13 25-04-2019 08-05-2019
78 26 06-12-2018 01-01-2019
我想要的是每个student_id的提交和评论之间的日期列差异
这在MySQL 8.0中会更简单(并且效率更高),我们将为此使用窗口函数。
在早期版本中,一种选择是使用相关子查询来为每个提交检索下一次审阅的日期:
select
t.*,
datediff(review_date, submission_date) gapdays
from (
select
student_id,
date submission_date
(
select min(t1.date)
from mytable t1
where
t1.student_id = t.student_id
and t1.date > t.date
and t1.phase = 'review'
) review_date
from mytable t
where t.phase = 'submitted'
) t
order by student_id, submission_date
为了提高性能,请考虑在(student_id, phase, date)
上建立索引(此处索引的列顺序很重要)。>>
| student_id | submission_date | review_date | gapdays |
| ---------- | --------------- | ----------- | ------- |
| 34 | 2019-03-05 | 2019-04-15 | 41 |
| 34 | 2019-04-25 | 2019-05-08 | 13 |
| 78 | 2018-12-06 | 2019-01-01 | 26 |
具有自我加入和聚合: