【问题标题】:Creating Attendance query for 4 Consecutive absence per student为每个学生创建 4 次连续缺勤的考勤查询
【发布时间】:2021-12-14 00:31:49
【问题描述】:

我正在创建一个出勤查询。检查每个学生连续缺勤四次,我正在使用以下查询,但是该查询永远不会重置新学生的缺勤。

设置@absentRun = 0;

选择学生ID、姓名、年级、电话、日期、状态、 CASE缺席ID 当 1 THEN CASE WHEN @absentRun= 4 THEN @absentRun:= 1 ELSE @absentRun := @absentRun + 1 END 当 2 那么@absentRun := 0 结束为缺席 FROM 按日期、姓名的考勤组

例如,如果学生 ID 为 1,下一条记录的学生 ID 为 2,我希望缺勤计数如下表所示重置

<table>
  <tr>
    <th>StudentID</th>
    <th>Name</th>
    <th>Grade</th>
    <th>Phone</th>
    <th>Date</th>
    <th>Status</th>
    <th>AbsenceID</th>
    <th>AbsentCount</th>
  </tr>
  <tr>
    <td>1</td>
    <td>Peter</td>
  <td>2</td>
  <td>57575r</td>
  <td>09/12/2021</td>
  <td>Absent</td>
  <td>1</td>
  <td>1</td>
  </tr>
  <tr>
    <td>1</td>
    <td>Pedro</td>
  <td>3</td>
  <td>444</td>
  <td>09/12/2021</td>
  <td>absent</td>
   <td>1</td>
   <td>1</td>
  </tr>
   <tr>
    <td>1</td>
    <td>Pedro</td>
  <td>3</td>
  <td>444</td>
  <td>09/12/2021</td>
  <td>absent</td>
   <td>1</td>
   <td>2</td>
  </tr>
   <tr>
    <td>1</td>
    <td>Pedro</td>
  <td>3</td>
  <td>444</td>
  <td>09/12/2021</td>
  <td>absent</td>
   <td>1</td>
   <td>3</td>
  </tr>
   

</table>

如果需要任何进一步的信息,请告诉我。

非常感谢您的帮助!

【问题讨论】:

  • MySql SQL Server - 我删除了冲突的标签,请重新添加您正在使用的 RDBMS 的标签。

标签: sql


【解决方案1】:

所以查看 mariadb 文档(没有使用过 maria 并且没有要测试的环境)。

似乎这可能适用于滚动聚合。

https://mariadb.com/kb/en/window-frames/

SELECT 
   studentid, 
   name, 
   grade, 
   phone, 
   date, 
   status, 
   sum (absenceID) OVER (ORDER BY date RANGE BETWEEN 4 PRECEDING AND CURRENT ROW) AS rolling_absence 
  FROM Attendance

【讨论】:

    【解决方案2】:

    如果您使用的是 MS-SQL Server,外部应用将在这里工作。

    我没有像以前那样使用变量。我将使用它们的地方是从表中收集聚合值,例如最大日期。

    通常对于这种类型的查询,我会利用子查询或窗口函数来计算。

    select 
      a.studentid, 
      a.studentname, 
      a.phonenumber, 
      a.attendance_date, 
      a.absense_flag, 
      CASE 
        WHEN SUM( a2.absence_flag ) >= 4 THEN  1 
        ELSE 0 
        END AS fourday_absence_flag 
    from attendance a
      OUTER APPLY  
      (
        SELECT TOP 4 
          absence_flag
        FROM attendance a2
        WHERE 
          a2.studentid = a.studentid 
          a2.attendance_date <= a.attendance_date 
        ORDER BY attendance_date DESC 
      ) a2
     GROUP BY 
        a.studentid, 
        a.studentname, 
        a.phonenumber, 
        a.attendance_date, 
        a.absense_flag
    

    【讨论】:

    • 非常感谢您的回答,但是当我尝试使用查询时出现以下错误。错误:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 11 行的“OUTER APPLY (SELECT TOP 4 AbsenceReasonID FROM Attend...”附近使用正确的语法
    • 知道了 - 是的,并非所有数据库都支持外部应用。通过查看 mariadb 文档添加了另一个答案。还看到 mysql 确实支持一些聚合查询,这些查询利用类似于您处理此问题的方式的变量。没有这种方法的经验。不过看起来应该是可行的。
    【解决方案3】:

    虽然它并不完美,但我终于能够让它工作,但我在这里发布它希望它可以帮助某人并希望如果有人找到更有效的解决方案让我知道。

    1. 我创建了一个包含所有字段的视图,并使用以下 select 语句添加了序列: select Name, date_absent, Attendance status, stu_id,AbsenceReasonID,row_number() over (partition by StudentID order by Date) AS seqnum

    2. 使用嵌套的 select sql 语句通过 case 条件计算缺勤情况。 a) 如果状态存在,则缺席原因 ID = 1 将计数器设置为零(从报告中消除任何存在) b)如果缺席reasonid = 2(不存在)AND序列号小于或等于2,如果是,则检查计数器是否不等于0,则计数器(@absentrun)= seqnum,否则计数器等于1 c) 如果缺席原因 id = 2(缺席)AND 序列号大于 2,则如果计数器 = 4(我正在寻找四个缺席,则将计数器重置为 1)否则将计数器缺席加一运行

    SELECT * FROM ( 选择姓名、年级、电话、日期、状态、缺勤原因ID、序列号、CASE 当 AbsenceReasonID = 1 时 @absentRun := 0 当 AbsenceReasonID = 2 AND seqnum 2 THEN CASE WHEN @absentRun = 4 THEN @absentRun := 1 ELSE @absentRun := @absentRun + 1 END

    在场结束

    FROM Attend_seqnum )e WHERE Present >= 4 AND date BETWEEN NOW() - INTERVAL 30 DAY AND NOW() 按日期排序

    希望对某人有所帮助:)

    【讨论】:

      猜你喜欢
      • 2012-05-20
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多