2013-07-16 3 views
-1

합류와 나는 학교에 존재하는 작은 클래스에서 가장 오래된 사람을 찾으려면 최소한의 최소를 찾는 방법
SQL : 효율적

내가 가진 내가 필요이

 
School Class DOB   Stu_ID 
1 1 2000-10-05 S007 1 1 2001-08-03 S006 1 2 2000-10-05 S005 1 2 2001-08-03 S004 2 3 2000-10-05 S003 2 4 2001-08-03 S002 2 4 2000-10-05 S001 2 5 2001-08-03 S009

같은 테이블 결과 테이블을

 
School Class DOB   Stu_ID 
1 1 2000-08-03 S006 2 3 2000-10-05 S003

으로 가져옵니다. 즉, 각 학교에서 가장 작은 계층에 속하는 가장 오래된 사람입니다.

+0

니스. 지금까지 뭐 해봤 어? – OzrenTkalcecKrznaric

+0

어떤 엔진 및 버전입니까? – gbn

+0

예상 출력이 잘못되었습니다. 'Stu_ID'와'DOB'는 두 행에서 일치하지 않습니다. – hims056

답변

1

rn은 학교마다 초기화되며 (PARTITION BY) 가장 낮은 클래스부터 가장 오래된 DOB까지 계산됩니다.

select School, Class, DOB, Stu_ID 
from (select t.*, 
      dense_rank(ClassCnt) over (partition by school) as ClassSizeRank 
     from (select t.*, 
        count(*) over (partition by school, class) as ClassCnt, 
        row_number over (partition by school, class order by dob) as AgeSegnum 
      from t 
      ) t 
    ) t 
where ageseqnum = 1 and ClassSizeRank = 1; 

나는이 유형의 쿼리 조인 사용을 권장하지 것이다 :

DENSE_RANK는 학생들이 생일

0

가장 좋은 방법은 중간 변수를 계산하기 위해 윈도우 함수를 사용하는 것입니다을 공유 할 수 있습니다. 이것이 숙제/수업을위한 것이라면, 질문에 그 것을 명시해야합니다.