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

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

最佳答案

在 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 且值为“通过”的不同学生。

关于mysql - 分组用户,MySQL 上匹配的连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29501550/

相关文章:

sql - 你可以在 MySql 中使用自动增量而不是它是主键吗

mysql - Magento,我需要将第一个产品图像定义为缩略图

mysql - 如何通过消除:?在mysql中将时间转换为数字

SQL : join 3 tables and show all data from the 2 tables in sub query

sql - 具有前一个键的行中列的值

javascript - 如何发送和接收动态输入字段的MySQL数据

MySQL TIMEDIFF() 返回两个时间之间的差值和时间总和

mysql - 删除带左连接的数据表

php - 将表二中的数据添加到表一中

javascript - 如何在 Sheetrock 中使用 LIKE 运算符