Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多条记录的Oracle查询_Oracle - Fatal编程技术网

具有多条记录的Oracle查询

具有多条记录的Oracle查询,oracle,Oracle,我有一个包含多个列的students表,但是,我只对re enrollment列和exitcode列感兴趣。当一名学生毕业时,他们被授予“W21”代码,当他们晋升到下一个年级时,他们被授予“P”代码。他们在重新注册栏中也会有相应的记录,其中包含注册日期 我需要找到所有exitcode为“W21”并且在过去四年中也在该地区的学生。因此,一个代码为“W21”的学生在该地区只呆了3年,不会被拉走 Lisa, Simpson 240011111111 20-AUG-07 W10 L

我有一个包含多个列的students表,但是,我只对re enrollment列和exitcode列感兴趣。当一名学生毕业时,他们被授予“W21”代码,当他们晋升到下一个年级时,他们被授予“P”代码。他们在重新注册栏中也会有相应的记录,其中包含注册日期

我需要找到所有exitcode为“W21”并且在过去四年中也在该地区的学生。因此,一个代码为“W21”的学生在该地区只呆了3年,不会被拉走

Lisa, Simpson   240011111111        20-AUG-07   W10
Lisa, Simpson   240011111111        18-AUG-08   W10
Lisa, Simpson   240011111111        18-AUG-09   W21
Bart, Simpson   240022222222        07-AUG-00   W10
Bart, Simpson   240022222222        09-AUG-01   W10
Bart, Simpson   240022222222        08-AUG-02   W10
Bart, Simpson   240022222222        11-AUG-03   W10
Bart, Simpson   240022222222        09-AUG-04   W10
Bart, Simpson   240022222222        08-AUG-05   W10
Bart, Simpson   240022222222        14-AUG-06   W10
Bart, Simpson   240022222222        20-AUG-07   W10
Bart, Simpson   240022222222        18-AUG-08   W10
Bart, Simpson   240022222222        18-AUG-09   W21
Homer, Simpson  240000333333        07-AUG-00   W10
Homer, Simpson  240000333333        09-AUG-01   W10
Homer, Simpson  240000333333        08-AUG-02   W10
Homer, Simpson  240000333333        11-AUG-03   W10
Homer, Simpson  240000333333        09-AUG-04   W10
Homer, Simpson  240000333333        08-AUG-05   W10
Homer, Simpson  240000333333        14-AUG-06   W10
Homer, Simpson  240000333333        20-AUG-07   W10
Homer, Simpson  240000333333        18-AUG-08   W10
Homer, Simpson  240000333333        18-AUG-09   NS
Homer, Simpson  240000333333        21-AUG-09   W21
基本上,我只需要拉巴特和荷马,因为他们在毕业前的四年在这个地区。丽莎不会被拉

Lisa, Simpson   240011111111        20-AUG-07   W10
Lisa, Simpson   240011111111        18-AUG-08   W10
Lisa, Simpson   240011111111        18-AUG-09   W21
Bart, Simpson   240022222222        07-AUG-00   W10
Bart, Simpson   240022222222        09-AUG-01   W10
Bart, Simpson   240022222222        08-AUG-02   W10
Bart, Simpson   240022222222        11-AUG-03   W10
Bart, Simpson   240022222222        09-AUG-04   W10
Bart, Simpson   240022222222        08-AUG-05   W10
Bart, Simpson   240022222222        14-AUG-06   W10
Bart, Simpson   240022222222        20-AUG-07   W10
Bart, Simpson   240022222222        18-AUG-08   W10
Bart, Simpson   240022222222        18-AUG-09   W21
Homer, Simpson  240000333333        07-AUG-00   W10
Homer, Simpson  240000333333        09-AUG-01   W10
Homer, Simpson  240000333333        08-AUG-02   W10
Homer, Simpson  240000333333        11-AUG-03   W10
Homer, Simpson  240000333333        09-AUG-04   W10
Homer, Simpson  240000333333        08-AUG-05   W10
Homer, Simpson  240000333333        14-AUG-06   W10
Homer, Simpson  240000333333        20-AUG-07   W10
Homer, Simpson  240000333333        18-AUG-08   W10
Homer, Simpson  240000333333        18-AUG-09   NS
Homer, Simpson  240000333333        21-AUG-09   W21
我很难做到这一点,任何帮助都会很好


谢谢诸如此类的东西,它不会很快,但会起作用:

select *
  from studentrecords
 where     exitcode = 'W21'
       and studentid in (select studentid
                           from studentrecords
                          where exitcode = 'W21'
                         intersect
                           select studentid
                             from studentrecords
                            where enrollmentyear >= :fouryearsago
                         group by studentid
                           having count (*) >= 4)

带有having子句的group by应足以满足此要求。将日期截断为年,并计算不同的应能解决年数问题

select
   e.student, e.sid, count(distinct trunc(dated,'YYYY')) num_years
from enrollments e
inner join (select distinct sid from enrollments where exitcode = 'W21' ) x on e.sid = x.sid
group by e.student, e.sid
having count(distinct trunc(dated,'YYYY')) > 3

+----+---------------+--------------+-----------+
|    |    STUDENT    |     SID      | NUM_YEARS |
+----+---------------+--------------+-----------+
|  1 | Bart,Simpson  | 240022222222 |        10 |
|  2 | Homer,Simpson | 240000333333 |        10 |
+----+---------------+--------------+-----------+
看到它在工作吗

如果exitcode W21是该列中的最大值,则可以通过一次数据传递获得结果:

select
   e.student, e.sid, count(distinct trunc(dated,'YYYY')) num_years
from enrollments e
group by e.student, e.sid
having count(distinct trunc(dated,'YYYY')) > 3
And max(exitcode) = 'W21'

帮助我们帮助你-请分享一些样本数据和你希望得到的结果。请展示一个,也可以阅读以获得更好的响应。谢谢。什么是“过去四年来一直在该地区”的定义?他们是否需要在表格中有几行,并在2013年、2014年、2015年和2016年的每一年都有重新注册日期?(或者重新入学是否意味着他们已经在那里呆了一年,你检查了2014年、2015年和2016年的重新入学情况?)?编写查询很容易,只要需求非常明确。他们每年会有一行。因此,在这个表中,每个条目至少需要4个条目。这个表的速度不是很差,速度也不是问题。但是,最后一个子查询是一个问题,我需要确保每个学生在过去4年都在学区。例如,如果巴特在2015年毕业,我将验证他过去4年是否在学区。他本可以在该区上小学,转学后在最后一年上学时才回来。如果是这种情况,我不希望他出现在我的数据中。只需在子查询的第二部分添加一个where子句,将记录限制为4年或更少(过去4年的记录计数为4)修改查询以满足过去4年的要求谢谢您的帮助。