2016-12-22 8 views
0

私は複数の列を持つstudentsテーブルを持っていますが、私は再登録列と終了コード列にのみ興味があります。学生が卒業したときには「W21」のコードが与えられ、次の段階に昇格すると「P」というコードが与えられます。また、再登録欄には、登録日を含む対応するレコードがあります。複数のレコードを持つOracleクエリ

「W21」の終了コードを持つすべての生徒を見つける必要があります。また、過去4年間、地区にもいます。したがって、3年間だけ地区にいた「W21」のコードを持つ生徒は引っ張られません。彼らは、彼らが卒業4年前に地区内のどこにあるため

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 

基本的に私はバートとホーマーをプルする必要があります。リサは引っ張られないだろう。

私はこれを達成する方法を困惑しており、どんな助けも素晴らしいものです。このような

+1

ヘルプたちお手伝いをしてください - いくつかのサンプルデータとその結果をお寄せください。 – Mureinik

+1

[mcve]を表示してください。また、[ask]を読むと、より良い応答を得ることができます。ありがとう。 – OldProgrammer

+0

「過去4年間、地区にいますか?」という定義は何ですか? 2013年、2014年、2015年、2016年のそれぞれに再入学時期があり、テーブルに複数の行が必要ですか? (または再登録は、既に1年間そこにいたことを意味し、2014年、2015年および2016年に再入国を確認していますか?)過去に十分に届いている再入院日の少なくとも1つ、 2013年9月1日またはそれ以前に、要件が明確である限り、クエリの作成は簡単です。 – mathguy

答えて

0

何か

おかげで、非常に高速であることを行っていないが、それは動作します:

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

この速度はそれほど悪くはないが、とにかく速度は問題ではない。しかし、最後のサブクエリは、各学生が過去4年間に地区にいたことを確認するために必要な問題です。 – user3163084

+0

たとえば、Bartが2015年に卒業した場合、私は彼の過去4年間が地区にあったことを確認したいと思います。彼は地区内の小学校に行って、去年の学校に戻ってきただけだった。これが事実なら、私は彼を私のデータに入れたくないでしょう。 – user3163084

+0

サブクエリの2番目の部分にwhere句を追加して、レコードを4才以下に制限する(最後の4年間のレコードの数は4) –

0

グループが持つ句で、このために十分なはずです。日付を年に切り捨て、区別すると、年数は解決されます。

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

それが終了コードのW21は、その列で見つかった最大値であるならば、あなたは、データの単一パスで結果を達成できるhttp://rextester.com/VOGNJ58311

での作業を参照してください。

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' 
関連する問題