Necesito realizar una consulta SQL relativamente fácil de explicar pero (dada mi capacidad limitada) difícil de escribir.Consulta compleja de SQL que implica valores consecutivos
Asumamos que tenemos una tabla similar a ésta:
exam_no | name | surname | result | date
---------+------+---------+--------+------------
1 | John | Doe | PASS | 2012-01-01
1 | Ryan | Smith | FAIL | 2012-01-02 <--
1 | Ann | Evans | PASS | 2012-01-03
1 | Mary | Lee | FAIL | 2012-01-04
... | ... | ... | ... | ...
2 | John | Doe | FAIL | 2012-02-01 <--
2 | Ryan | Smith | FAIL | 2012-02-02
2 | Ann | Evans | FAIL | 2012-02-03
2 | Mary | Lee | PASS | 2012-02-04
... | ... | ... | ... | ...
3 | John | Doe | FAIL | 2012-03-01
3 | Ryan | Smith | FAIL | 2012-03-02
3 | Ann | Evans | PASS | 2012-03-03
3 | Mary | Lee | FAIL | 2012-03-04 <--
Tenga en cuenta que exam_no
y date
no están necesariamente relacionados como uno podría esperar de la clase de ejemplo que elegí.
Ahora, la consulta que tengo que hacer es la siguiente:
- Desde el último examen (
exam_no
= 3) una lista de los estudiantes que han fracasado (John Doe
,Ryan Smith
yMary Lee
). - Para cada uno de estos estudiantes, encuentre la fecha del primero del lote de exámenes consecutivos con errores. Otra forma de expresarlo sería: para cada uno de estos estudiantes, encuentre la fecha del primer examen reprobado que se presente después de su último examen de aprobación. (Mira las flechas en la tabla).
El cuadro resultante debe ser algo como esto:
name | surname | date_since_failing
------+---------+--------------------
John | Doe | 2012-02-01
Ryan | Smith | 2012-01-02
Mary | Lee | 2012-03-04
¿Cómo puedo realizar una consulta de este tipo?
Gracias por su tiempo.
Otros lectores: nota que lo etiquetó 'MySQL' –
Creo que puede unirse en la misma tabla en result = 'FAIL' y seleccione de allí el que tenga la fecha más alta. ¿Qué has intentado? – Jocke
¿Qué quiere decir con "* el último examen *"? El examen que tiene la última fecha? – eggyal