SQL 确定缺勤是否为“辍学”
SQL to determine if a non-attendance is a “DROPOUT”
我每周出勤 table,每周出勤 "Present" 或 "Absent"
需要修改如下并附上理由:
如果一个人整整一个月都没有出席,他将更改为 "DROPOUT" 数周 he/she 在该月之前缺席,直到他重新出席。
我已经尝试使用 SQL 检查 "Streaks" 检查合并出勤的月份,但无法使 "Dropped out from" 正确。任何帮助将不胜感激。
使用 Sample SourceData having 1 as "Absent" & 0 as "Present" ,我使用了以下 SQL 但有一些错误
/* Calculate RunGroup */
SELECT WeekNum, Abs_Status, (SELECT COUNT(*) FROM [SourceData] G WHERE G.Abs_Status <> GR.Abs_Status AND G.WeekNum <= GR.WeekNum) as RunGroup
INTO [RunGroup]
FROM [SourceData] GR;
GO
/* Determine how many weeks in each run */
SELECT Abs_Status, MIN(WeekNum) as StartDate, MAX(WeekNum) as EndDate, COUNT(*) as Games
INTO [WeeksinRun]
FROM [RunGroup] A GROUP BY Abs_Status, RunGroup ORDER BY Min(WeekNum);
GO
/****** What to mark as Dropouts ******/
SELECT [StartDate]
,[EndDate]
INTO [WeekstoUpd]
FROM [WeeksinRun] a,[SourceData] b, [SourceData] c
where a.[StartDate] = b.[Weeknum]
and a.[EndDate] = c.[Weeknum]
and b.[MONTH] <> c.[MONTH]
and a.Abs_Status = '1'
and a.[StartDate] <> '2013 Week 01';
GO
/****** Update Dropout Weeks ******/
update [SourceData]
set [SourceData].[Abs_Status] = '-2'
FROM [SourceData],[WeekstoUpd]
where [WeekNum]>=[StartDate] and [WeekNum]<=[EndDate];
GO
/****** Update Absent Weeks ******/
UPDATE [SourceData]
SET [Abs_Status] = '-1'
FROM [SourceData]
WHERE [SourceData].[Abs_Status] = '1';
GO
不确定我是否理解正确,但也许这就是您想要的:
update s
set s.Abs_Status = 2
from SourceData S
where not exists (
select 1 from SourceData S2
where S2.Abs_Status = 0 and S2.MONTH = S.MONTH
) and Abs_status = 1
update s
set s.Abs_Status = 2
from SourceData S
where 2 = (
select top 1 S2.Abs_Status from SourceData S2
where S2.Abs_Status <> 1 and S2.WeekNum > S.WeekNum
order by S2.WeekNum asc
) and Abs_status = 1
update s
set s.Abs_Status = 2
from SourceData S
where 2 = (
select top 1 S2.Abs_Status from SourceData S2
where S2.Abs_Status <> 1 and S2.WeekNum < S.WeekNum
order by S2.WeekNum desc
) and Abs_status = 1
select * from [SourceData];
第一次更新会将整个月份 Abs_Status = 1
的行的 Abs_Status 更新为 2
接下来的 2 次更新会将缺席之前/之后的部分月份更新为 2。
我每周出勤 table,每周出勤 "Present" 或 "Absent"
需要修改如下并附上理由:
如果一个人整整一个月都没有出席,他将更改为 "DROPOUT" 数周 he/she 在该月之前缺席,直到他重新出席。
我已经尝试使用 SQL 检查 "Streaks" 检查合并出勤的月份,但无法使 "Dropped out from" 正确。任何帮助将不胜感激。
使用 Sample SourceData having 1 as "Absent" & 0 as "Present" ,我使用了以下 SQL 但有一些错误
/* Calculate RunGroup */
SELECT WeekNum, Abs_Status, (SELECT COUNT(*) FROM [SourceData] G WHERE G.Abs_Status <> GR.Abs_Status AND G.WeekNum <= GR.WeekNum) as RunGroup
INTO [RunGroup]
FROM [SourceData] GR;
GO
/* Determine how many weeks in each run */
SELECT Abs_Status, MIN(WeekNum) as StartDate, MAX(WeekNum) as EndDate, COUNT(*) as Games
INTO [WeeksinRun]
FROM [RunGroup] A GROUP BY Abs_Status, RunGroup ORDER BY Min(WeekNum);
GO
/****** What to mark as Dropouts ******/
SELECT [StartDate]
,[EndDate]
INTO [WeekstoUpd]
FROM [WeeksinRun] a,[SourceData] b, [SourceData] c
where a.[StartDate] = b.[Weeknum]
and a.[EndDate] = c.[Weeknum]
and b.[MONTH] <> c.[MONTH]
and a.Abs_Status = '1'
and a.[StartDate] <> '2013 Week 01';
GO
/****** Update Dropout Weeks ******/
update [SourceData]
set [SourceData].[Abs_Status] = '-2'
FROM [SourceData],[WeekstoUpd]
where [WeekNum]>=[StartDate] and [WeekNum]<=[EndDate];
GO
/****** Update Absent Weeks ******/
UPDATE [SourceData]
SET [Abs_Status] = '-1'
FROM [SourceData]
WHERE [SourceData].[Abs_Status] = '1';
GO
不确定我是否理解正确,但也许这就是您想要的:
update s
set s.Abs_Status = 2
from SourceData S
where not exists (
select 1 from SourceData S2
where S2.Abs_Status = 0 and S2.MONTH = S.MONTH
) and Abs_status = 1
update s
set s.Abs_Status = 2
from SourceData S
where 2 = (
select top 1 S2.Abs_Status from SourceData S2
where S2.Abs_Status <> 1 and S2.WeekNum > S.WeekNum
order by S2.WeekNum asc
) and Abs_status = 1
update s
set s.Abs_Status = 2
from SourceData S
where 2 = (
select top 1 S2.Abs_Status from SourceData S2
where S2.Abs_Status <> 1 and S2.WeekNum < S.WeekNum
order by S2.WeekNum desc
) and Abs_status = 1
select * from [SourceData];
第一次更新会将整个月份 Abs_Status = 1
的行的 Abs_Status 更新为 2接下来的 2 次更新会将缺席之前/之后的部分月份更新为 2。