Проблема: Я пытаюсь подсчитать количество последовательных пропусков занятий в определенном классе в течение недели.
например, если в классе MATH1234 есть занятия по Дню 1 периода 4 и Дню 4 периода 3 , а ученик 0012345 отсутствовал в течение Дня 1 Период 4 и Дня 4 Период 3 в Неделя 1 , то же самое, как если бы этот студент отсутствовал в течение Дня 4 Период 3 в Неделя 1 и День 1 Период 4 в Неделя 2 .
У меня есть таблица с именем Уроки , которые содержат текущий список всех учащихся и классов, в которые они зачислены, а также отсутствовали ли они в каких-либо классах:
Уроки ([Идентификатор студента]], [Номер класса], [Номер строки], [Академический период], [Год], [Срок], [Неделя], [Период дня], [ClassDate], [IsAbsent], [ReasonCode], [ConsecutiveAbs])
Мне нужно рассчитать количество последовательных отсутствий, которые учащиеся имеют для каждого класса, в который они записаны.в том месте, где последовательный пресс находится в течение одной недели (см. объяснение выше).
Учитывая, что:
Student ID Class Number Line Number Academic Period Year Term Week Day Period ClassDate IsAbsent ReasonCode ConsecutiveAbs
001234 1CVASX11 1 1 2011 1 3 1 2011-02-14 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 4 1 2011-02-21 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 4 2 2011-02-23 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 5 1 2011-02-28 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 5 2 2011-03-02 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 6 1 2011-03-07 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 6 2 2011-03-09 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 7 2 2011-03-16 00:00:00.000 1 U 0
001234 1CVASX11 1 1 2011 1 9 1 2011-03-28 00:00:00.000 1 U 0
001234 1CVASX61 6 1 2011 1 9 2 2011-03-28 00:00:00.000 1 U 0
ConsecutiveAbs для ученика 001234 для классаЧисло 1CVASX11 на ClassDate 28/3 будет равно 1, поскольку предыдущее отсутствие к этой дате было 16/3, что больше недели назад.Точно так же число ConsecutiveAbs на ClassDate 9/3 будет равно 2, так как этот ученик также отсутствовал 7/3, то есть в течение периода времени, равного одной неделе.
В настоящее время я занимаюсь обновлением таблицы «Уроки».значение ConsecutiveAbs вроде этого:
UPDATE Lessons
SET ConsecutiveAbs =
(SELECT ISNULL(SUM(CAST(IsAbsent AS numeric)), 0)
FROM Lessons AS L3
WHERE L3.IsAbsent = 1
AND L1.IsAbsent <> 0
AND L3.[Student ID] = L1.[Student ID]
AND L3.[Class Number] = L1.[Class Number]
AND L3.[Line Number] = L1.[Line Number]
AND L3.[Year] = L1.[Year]
AND L3.[ClassDate] <= L1.[ClassDate]
AND (L3.[ClassDate] > (SELECT MAX(L2.ClassDate)
FROM Lessons AS L2
WHERE L2.IsAbsent = 0
AND L2.[Student ID] = L1.[Student ID]
AND L2.[Class Number] = L1.[Class Number]
AND L2.[Line Number] = L1.[Line Number]
AND L2.[Year] = L1.[Year]
AND L2.ClassDate < L1.[ClassDate]
) OR (SELECT MAX(L2.ClassDate)
FROM Lessons AS L2
WHERE L2.IsAbsent = 0
AND L2.[Student ID] = L1.[Student ID]
AND L2.[Class Number] = L1.[Class Number]
AND L2.[Line Number] = L1.[Line Number]
AND L2.[Year] = L1.[Year]
AND L2.ClassDate < L1.[ClassDate]
) IS NULL))
FROM Lessons AS L1
Но это дает мне следующее:
001234 1CVASX11 1 1 2011 1 3 1 2011-02-14 00:00:00.000 1 U 1
001234 1CVASX11 1 1 2011 1 4 1 2011-02-21 00:00:00.000 1 U 2
001234 1CVASX11 1 1 2011 1 4 2 2011-02-23 00:00:00.000 1 U 3
001234 1CVASX11 1 1 2011 1 5 1 2011-02-28 00:00:00.000 1 U 4
001234 1CVASX11 1 1 2011 1 5 2 2011-03-02 00:00:00.000 1 U 5
001234 1CVASX11 1 1 2011 1 6 1 2011-03-07 00:00:00.000 1 U 6
001234 1CVASX11 1 1 2011 1 6 2 2011-03-09 00:00:00.000 1 U 7
001234 1CVASX11 1 1 2011 1 7 2 2011-03-16 00:00:00.000 1 U 8
001234 1CVASX11 1 1 2011 1 9 1 2011-03-28 00:00:00.000 1 U 9
001234 1CVASX61 6 1 2011 1 9 2 2011-03-28 00:00:00.000 1 U 9
Мне нужно установить период времени, чтобы он складывался только в течение недели послеClassDate.У кого-нибудь есть идеи?