2017-02-17 1 views
1

두 개의 테이블, 학생 및 로그가 있습니다.임의의 값을 최대 값으로 선택

LOG 테이블에는 학생 당 0 개 이상의 레코드가있을 수 있습니다. LOG 테이블의 레코드는 열 SUBTYPE로 분류됩니다. SUBTYPE 값은 'H', 'L1', 'L2', 'L3', 'M', 'P1', 'P2'및 'Px'입니다.

각 학생 이름을 한 번만 나열하는 보고서를 작성하려고합니다. 가장 심각한 문자는 LOG 테이블의입니다.

자연스럽게 MAX (하위 유형)가 생각납니다.하지만 하위 유형의 실제 최대 영숫자 값을 선택하지 않으므로 작동하지 않습니다. 미리 정의 된 "심각도에 따라 선택하려고합니다. ". 심각도, BTW는 DB에 저장되지 않으므로 쿼리 내부에서이를 어떻게 든 정의해야합니다. 예를 들어

...

STUDENTS TABLE 
ID  LAST_NAME  FIRST_NAME 
------------------------------------ 
2  Smith   John 
3  Jones   Bob 
4  Bower   Jack 


LOG TABLE 
ID  STUDENTSID  SUBTYPE 
------------------------------------ 
1  2     P1 
2  2     M 
3  2     L1 
4  3     L2 
5  3     P2 
6  3     H 

은 아류 값은 실제로으로 정렬/평가해야합니다

다음
(From Least Severe) 
1. P1 
2. L1 
3. M 
4. L2 
5. P2 
6. H 
7. L3 
8. Px 
(To Most Severe) 

내가 같이 내 보고서를 필요로하는 것이다. 참고로 Jack Bower는 로그 테이블에 레코드가 없기 때문에 보고서에 없습니다.

DESIRED REPORT OUTPUT: 
John Smith --- M 
Bob Jones ---- H 

아무도 올바른 방향으로 나를 가리킬 수 있습니까?

답변

0
order by 
    case subtype 
    when 'P1' then 1 
    when 'L1' then 2 
    when 'M' then 3 
    ... 
    end 
1

당신은 그에 따라 row_number 기능을 사용하여 하위 유형의 우선 순위를해야합니다. 그런 다음 각 학생의 첫 번째 행을 선택하십시오.

select id,first_name,last_name 
from (
select s.* 
,row_number() over(partition by s.id 
        order by case when l.subtype='P1' then 1 
           when l.subtype='L1' then 2 
           when l.subtype='M' then 3 
           when l.subtype='L2' then 4 
           when l.subtype='P2' then 5 
           when l.subtype='H' then 6 
           when l.subtype='L3' then 7 
           when l.subtype='Px' then 8 
        end desc) as rnum 
from students s 
join logs l on s.id=l.studentsid 
) x 
where rnum = 1 
+0

@mathguy .. 주문은 모든 주문 기록을 반환합니다. 이것은 op가 필요로하는 학생 당 1 행을 반환합니다. fyi .. 나는 중복 답변을 게시하는 팬이 아니며 다른 답변은 질문에 대답하지 않기 때문에이 게시글 만 게시했습니다. –

+0

맞아, 나는 그 결론에 직접 다가 가고 있었다. – mathguy

관련 문제