TSQL Подсчет количества последовательных отсутствий подряд за период времени - PullRequest
2 голосов
/ 22 марта 2011

Проблема: Я пытаюсь подсчитать количество последовательных пропусков занятий в определенном классе в течение недели.

например, если в классе 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.У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 22 марта 2011

Я думаю, что одна часть, которую вы пропускаете, ограничивает счет только отсутствием, если оно меньше 7 дней от первоначального отсутствия.

Следующий запрос включает эти критерии, и я считаю, что он дает результаты, которые вы ищете:

UPDATE LessonsAbsent
SET ConsecutiveAbs = (
    SELECT 
        ISNULL(SUM(CAST(IsAbsent AS numeric)), 0)
    FROM 
        Lessons RunningTotalAbsent 
    WHERE
        RunningTotalAbsent.IsAbsent = 1
        AND LessonsAbsent.[Student ID] = RunningTotalAbsent.[Student ID]
        AND LessonsAbsent.[Class Number] = RunningTotalAbsent.[Class Number]
        AND LessonsAbsent.[Line Number] = RunningTotalAbsent.[Line Number]
        AND LessonsAbsent.[Year] = RunningTotalAbsent.[Year]
        AND LessonsAbsent.ClassDate >= RunningTotalAbsent.ClassDate

        -- Only count as consecutive if the absence happened within under 7 days.
        AND DATEDIFF(DAY, RunningTotalAbsent.ClassDate, LessonsAbsent.ClassDate) < 7
    )
FROM Lessons LessonsAbsent 
WHERE LessonsAbsent.IsAbsent = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...