1

私は学生が欠席していたギャップなしで明確な期間を数える方法を探しています:

学生が欠席するたびに、欠席テーブルにレコードを作成します。一部の欠席は重複する可能性があり、一部は以前の欠席を延長します。

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  1

111111には2つの不在期間があり、間にギャップがあります

222222にも2つの欠勤期間がありますが、ギャップがないため、1つの欠勤期間と見なす必要があります。

333333の欠勤期間は1つだけです

444444には2つの期間が重複しており、これもギャップがないため、1つの不在期間と見なす必要があります。

誰かが私がこれについてのクエリを書くのを手伝ってもらえますか?

4

2 に答える 2

1

私はあなたの考えを理解しているとは思いませんが、学生の不在を数えたいのであれば、おそらくこれがあなたのやり方です。

SELECT `StudId`, COUNT(`StudId`) as `NbrAbs` FROM `AbsenseTableName` GROUP BY `StdId`

私はコードをテストしませんでした。しかし、それが主なアイデアです。

于 2011-07-27T13:52:54.000 に答える
1

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-27T14:50:41.017 に答える