分组用户,在MySQL上匹配的连续值

时间:2015-04-07 21:23:09

标签: mysql sql

所以我有一个看起来像这样的表:

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解决方案。

1 个答案:

答案 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且值为"传递"的不同学生。