Студент отсутствует в течение 5 дней подряд, за исключением праздников - PullRequest
0 голосов
/ 24 января 2020

Я использую воспламенитель кода и таблицу посещаемости, как показано ниже:

attendance ID   timestamp   student_id     status
     1           01-01-20        1           P
     2           01-01-20        2           P
     3           02-01-20        1           P
     4           02-01-20        2           A
     5           03-01-20        1           P
     6           03-01-20        2           A
     7           04-01-20        1           H
     8           04-01-20        2           H
     9           05-01-20        1           P
     10          05-01-20        2           A

Моя цель - получить идентификатор студента, который отсутствует в течение 3 последовательных дней в течение последнего 1 месяца с сегодняшнего дня, исключая праздничные дни в середине, как в приведенной выше таблице, идентификатор студента 2 должен быть тем, у которого 3 последовательных отсутствия, исключая выходные 4 января.

Я использую Apache / 2.4.23 (Win32) OpenSSL / 1.0. 2 часа PHP / 5.6.28 с mysql. Я смог получить три отсутствующих подряд, но когда в середине праздника, я не могу найти там работу. Вот мой существующий код:

SELECT *,
CASE
   WHEN (@studentID  = student_id) THEN @absentRun := IF(status = A, 0, @absentRun + 1)
   WHEN (@studentID := student_id) THEN @absentRun := IF(status = A, @absentRun + 1, 0)
END AS absentRun
FROM attendance
Where timestamp BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE() AND year='2019-2020'
ORDER BY student_id, timestamp;

Я был бы очень признателен за быстрый ответ от кого-то, кто поможет мне в этом. Я действительно надеюсь найти решение, так как я впервые написал здесь о помощи. Заранее спасибо.

1 Ответ

1 голос
/ 24 января 2020

Я понимаю это как вариант пробелов и островной проблемы. Вот один из способов ее решения с использованием row_number() (доступно в MySQL 8.0) - разница между номерами строк дает вам группу, к которой принадлежит каждая запись.

select 
    student_id,
    min(timestamp) timestamp_start,
    max(timestramp) timestamp_end
from (
    select 
        t.*, 
        row_number() over(partition by student_id order by timestamp) rn1,
        row_number() over(partition by student_id, status order by timestamp) rn2
    from mytable t
) t
where status = 2
group by student_id, rn1 - rn2
having count(*) >= 5

Это даст вам одну запись за каждую серию не менее 5 последовательных дней отсутствия для каждого студента. В качестве бонуса в запросе также отображается дата начала и окончания каждой серии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...