我正在寻找一种方法来统计学生缺课的不同时段:
每次学生缺勤时,我都会在缺勤表中创建一条记录,有些缺勤可能会重叠,有些会延长以前的缺勤时间。
StuId StrPer EndPer
------ ----------- -----------
111111 2011-01-10 2011-01-15
222222 2011-02-01 2011-02-05
222222 2011-02-06 2011-02-08
333333 2011-04-07 2011-04-14
444444 2011-04-20 2011-04-25
444444 2011-04-23 2011-04-28
111111 2011-05-01 2011-05-03现在我想要计算有间隙的唯一缺勤时间段的数量,结果应该是:
StuId NbrAbs
------ ------
111111 2
222222 1
333333 1
444444 1111111有两个缺勤期,中间有一个空档
222222也有两个缺勤期间,但没有空档,因此必须将其视为1个缺勤期间
333333只有1个缺勤期间
444444有2个期间重叠,也没有空档,因此必须将其视为1个缺勤期间
有人能帮我写一个查询吗?
发布于 2011-07-27 22:50:41
假设SQL 2005+应该可以工作:
SELECT '111111' as stuid,'2011-01-10' as start_date,'2011-01-15' as end_date into #data UNION ALL
SELECT '222222','2011-02-01','2011-02-05' UNION ALL
SELECT '222222','2011-02-06','2011-02-08' UNION ALL
SELECT '333333','2011-04-07','2011-04-14' UNION ALL
SELECT '444444','2011-04-20','2011-04-25' UNION ALL
SELECT '444444','2011-04-23','2011-04-28' UNION ALL
SELECT '111111','2011-05-01','2011-05-03'
;with periods as
(
select
stuid
,start_date
,end_date
,row_number() OVER (PARTITION BY stuid ORDER BY end_date ASC) as period_number
FROM #data
)
,periods2 AS
(
SELECT
p1.stuid
,p1.start_date
,p1.end_date
,p1.period_number
,ISNULL(DATEDIFF(DD,p1.end_date,p2.start_date),1) as period_gap
from periods p1
LEFT OUTER JOIN periods p2 on p2.stuid = p1.stuid
AND p2.period_number = p1.period_number + 1
)
SELECT
stuid
,count(period_gap) as number_discrete_absences
FROM periods2
WHERE period_gap > 0
GROUP BY stuid发布于 2011-07-27 21:52:54
我不太明白你的意思,但如果你想统计学生的缺勤人数,也许这是你的办法。
SELECT `StudId`, COUNT(`StudId`) as `NbrAbs` FROM `AbsenseTableName` GROUP BY `StdId`我没有测试代码。但这是主要的想法。
https://stackoverflow.com/questions/6845297
复制相似问题