繁体   English   中英

具有多个记录的Oracle Query

[英]Oracle Query with multiple records

我的学生表有多个列,但是,我只对重新注册列和exitcode列感兴趣。 当学生毕业时,他们的代码为“ W21”,当他们升入下一年级时,他们的代码为“ P”。 他们还将在重新注册列中包含包含注册日期的相应记录。

我需要找到所有退出代码为“ 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

基本上,我只需要拉Bart和Homer,因为他们毕业前的四年在该地区。 丽莎不会被拉。

我为如何做到这一点感到烦恼,任何帮助都会很棒。

谢谢

这样的事情不会很快,但是会起作用:

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 |
+----+---------------+--------------+-----------+

参见http://rextester.com/VOGNJ58311

如果退出码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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM