【问题标题】:TSQL Counting number of Consecutive Absence in a row within time periodSQL统计时间段内连续缺勤次数
【发布时间】:2011-03-22 02:43:45
【问题描述】:

问题:我正在尝试计算每个学生在一周内某个特定班级的连续缺勤次数。

例如如果课程 MATH1234Day 1 Period 4Day 4 Period 3 有课程,而学生 0012345 缺席了 第 1 天第 4 期第 4 天第 3 期第 1 周,就好像该学生缺席了 第 4 天第 3 期 em>第 1 周第 1 天第 4 期第 2 周.

我有一个名为 Lessons 的表格,其中包含所有学生和他们注册的课程的运行列表,以及他们是否缺席任何课程:

课时([学号]、[班号]、[行号]、[学年]、[年]、[学期]、[周]、[日期间]、[ 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

在 ClassDate 28/3 的班级编号 1CVASX11 的学生 001234 的连续 Abs 将为 1,因为该日期之前的缺勤是一周多前的 16/3。同样,ClassDate 9/3 上的 ConsecutiveAbs 将为 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 的一周内加起来。有人知道吗?

【问题讨论】:

    标签: tsql subquery


    【解决方案1】:

    我认为您缺少的一件是将计数限制为仅包括缺勤,即缺勤时间少于原始缺勤时间的 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
    

    【讨论】:

    • 效果很好! :) 我觉得我把事情复杂化了太多了 :(
    • 在同一主题上,有没有办法记录连续缺勤 5 次或以上的情况?如果学生错过了 2 节课,然后出现了 1 节课,然后错过了接下来的 3 节课,则仅算连续缺席 2 次和 3 次,而不是 5 次。
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多