所以我有一个看起来像这样的表:
student_id | date | exam_id | value
-----------------------------------------
10000 | 2015-01-01 | 1234232 | 'PASSED'
10000 | 2015-01-02 | 3123323 | 'PASSED'
10000 | 2015-01-03 | 4012031 | 'PASSED'
10000 | 2015-01-04 | 5012031 | 'PASSED'
10000 | 2015-01-05 | 7012031 | 'PASSED'
10000 | 2015-01-06 | 6012031 | 'FAILED'
20000 | 2015-01-01 | 1234232 | 'PASSED'
20000 | 2015-01-02 | 3123323 | 'PASSED'
20000 | 2015-01-03 | 4012031 | 'PASSED'
20000 | 2015-01-04 | 5012031 | 'FAILED'
20000 | 2015-01-05 | 7012031 | 'PASSED'
20000 | 2015-01-06 | 6012031 | 'FAILED'
20000 | 2015-01-07 | 9012031 | 'PASSED'
30000 | 2015-01-01 | 1234232 | 'FAILED'
30000 | 2015-01-02 | 3123323 | 'PASSED'
30000 | 2015-01-03 | 4012031 | 'PASSED'
30000 | 2015-01-04 | 5012031 | 'PASSED'
30000 | 2015-01-05 | 7012031 | 'PASSED'
30000 | 2015-01-06 | 6012031 | 'PASSED'
30000 | 2015-01-07 | 6012031 | 'FAILED'
我想提取连续通过5门或以上考试的每个不同学生(id)。所需的输出如下所示:
student_id
----------
10000
30000
id 2000的学生应该被排除在外,因为即使他通过了5次考试,他也没有通过5次考试。
脚本编写非常简单,但我想知道是否还有MySQL解决方案。
答案 0 :(得分:1)
在MySQL中,最简单的方法是使用变量:
select distinct student_id
from (select t.*,
(@rn := if(@sp = concat(student_id, ':', value), @rn + 1,
if(@sp := concat(student_id, ':', value), 1, 1)
)
) as rn
from table t cross join
(select @rn := 0, @sp := '') vars
order by student_id, date
) t
where rn = 5 and value = 'passed'
子查询按日期和值枚举每个学生的行。外部查询选择枚举值为5且值为"传递"的不同学生。