【发布时间】:2021-10-02 13:53:09
【问题描述】:
我有一个递归场景,我正在尝试解决,但无法使用 TSQL 解决,我正在寻求专业知识和帮助。
场景: 我正在处理课程课程和参加这些课程的学生人数。 每年都有一定数量的学生报名参加第一期课程,或者毕业到下一期课程。
会话如下所示:
每个会话都知道下一个会话的 ID。 例如学生从 2015 年第 1 学期开始,并在 2016 年进入第 2 学期。 最后一个会话没有 nextSessionID。
最终目标是通过两个聚合来按顺序获取会话:
我尝试过的: 我已经弄清楚如何获取 nextSessionID。 然后我尝试将其放入递归 CTE 中。但是,我无法让它超过 1 级。
我会很感激一些关于采取这个方向的指示。 下面列出了创建示例表和数据的代码。
感谢任何帮助和专业知识。
--create session table
create table #sessions
(
sessionInstanceID int,
SessionYear int,
AcademicYear int,
NextSessionInstanceID int
)
--populate session table
insert into #sessions(sessionInstanceID,SessionYear, AcademicYear, NextSessionInstanceID)
values( 1001 , 1 , 2015 , 1006),
( 1002 , 2 , 2015 , 1007),
( 1003 , 3 , 2015 , 1008),
( 1004 , 4 , 2015 , null),
( 1005 , 1 , 2016 , 1009),
( 1006 , 2 , 2016 , 1010),
( 1007 , 3 , 2016 , 1011),
( 1008 , 4 , 2016 , 1012),
( 1009 , 1 , 2017 , null),
( 1010 , 2 , 2017 , null),
( 1011 , 3 , 2017 , null),
( 1012 , 4 , 2017 , null)
--create enrolment table
create table #enroledStudents
(
sessionInstanceID int,
studentID int
)
--populate enrolment table
insert into #enroledStudents
values(1001, 1)
,(1001, 2)
,(1001, 3)
,(1001, 4)
,(1001, 5)
,(1001, 6)
,(1002, 1)
,(1002, 3)
,(1002, 4)
,(1002, 5)
,(1002, 6)
,(1003, 1)
,(1003, 3)
,(1003, 4)
,(1004, 1)
,(1005, 10)
,(1005, 11)
,(1005, 12)
,(1005, 13)
,(1006, 11)
,(1006, 12)
,(1006, 13)
,(1007, 11)
,(1007, 12)
,(1007, 13)
,(1008, 24)
,(1008, 25)
,(1008, 26)
--get sessions & the next academicSessionID
select s.sessionInstanceID as currentInstanceID, s.SessionYear as currentSessionYear, s.AcademicYear as currentAcademicYear,
s2.sessionInstanceID as nextSessionInstanceID , s2.SessionYear as nextSessionYear, s2.AcademicYear as nextAcademicYear
from #sessions s
left join #sessions s2 on s.AcademicYear = s2.AcademicYear - 1
and s.SessionYear = s2.SessionYear -1
with cte as
(
select * from #sessionsHierarchy
union all
select #sessionsHierarchy.*
from cte
join #sessionsHierarchy on cte.nextSessionInstanceID = #sessionsHierarchy.currentInstanceID
)
select cte.currentInstanceID, cte.currentAcademicYear, cte.currentAcademicYear,
--count()
from cte
join #enroledStudents on cte.currentInstanceID = #enroledStudents.sessionInstanceID
【问题讨论】:
标签: sql-server tsql common-table-expression