1

我正在尝试根据以下两个表格生成报告:

  Name        Start Year    End Year    No. Of Students Fill Order
School-ABC      2000         2004            1             1
School-DEF      2000         2004            2             3    
School-GHI      2000         2004            1             2    

  Name        Start Year    End Year    Joined On
Student-1       2000         2004        01-Jan
Student-2       2000         2004        03-Jan
Student-3       2000         2004        02-Jan
Student-4       2000         2004        15-Jan

预期输出如下:

  Name        Start Year    End Year    Joined On    School
Student-1       2000         2004        01-Jan     School-ABC
Student-2       2000         2004        03-Jan     School-DEF
Student-3       2000         2004        02-Jan     School-GHI
Student-4       2000         2004        15-Jan     School-DEF      

生成数据背后的逻辑:

  1. 第一个表格包含学校列表和可用座位(以及在FCFS基础上分配给学生的座位的优先级)
  2. 第二个表格包含入学学生名单的数据,包括入学日期和课程开始/结束年份。
  3. 我需要根据分配给每个学生的学校“填写订单”进行填充。

在分析了一段时间后,我得出一个结论,仅使用选择查询可能无法实现。目前,我计划为每个表使用两个游标并逐行处理记录。有没有更好的方法或者可以通过选择语句来实现?TIA

笔记:

  • 我使用的数据库是Oracle 10g
  • 我无法创建任何临时表或更改任何表中的数据。我严格拥有对数据库的只读访问权限。
4

1 回答 1

1

您可以使用 Oracle 分析函数。 row_number() over ()可以根据每个学生的加入日期为其分配一个编号。 sum() over ()可以计算出每所学校的第一个和最后一个学生。结合你得到的两者:

select  stud.name
,       stud.startyear
,       stud.endyear
,       stud.joinedon
,       schl.name as SchoolName
from    (
        select  name
        ,       coalesce(sum(NoOfStudents) over (order by FillOrder
                    range between unbounded preceding and 1 preceding),0)+1 FirstStudent
        ,       sum(NoOfStudents) over (order by FillOrder) as LastStudent
        from    Schools
        ) schl
join    (
        select  row_number() over (order by JoinedOn) as StudentRank
        ,       Students.*
        from    Students
        ) stud
on      stud.StudentRank between schl.FirstStudent and schl.LastStudent
order by
        stud.name

SQL Fiddle 上的实时示例。

于 2013-07-14T11:32:53.730 回答