MAX 값의 해당 로우를 조인하는 부분이 궁금하여 질문드립니다. 0 6 5,579

by 김재현 [SQL Query] oracle max ROW_NUMBER [2018.07.19 23:04:10]


20180719.png (11,661Bytes)

안녕하세요 현재 ORACLE 11G 사용중입니다.

첨부한 이미지와 같이 MAX로우값을 조인하고 싶습니다.

성적이 같을 수 있는 경우가 있을 수 있기 떄문에 ROW_NUMBER OVER()을 사용하여 짜고 있는데...

select 이름, ROW_NUMBER() over(ORDER BY 성적 DESC) AS 순위 FROM C

을 조인하고 WHERE 순위=1로 하면 제가 원하는 값이 안나오네요..

성적이 없는 경우가 있을 수도 있어 LEFT 조인을 하려고 하니 더욱더 복잡해지네요

답변부탁드립니다...

 

 

by jkson [2018.07.20 07:21:02]

B B1 김육은 왜 안 나오는 거죠?

작성하신 쿼리를 적어주시는 게..


by 김재현 [2018.07.20 08:57:40]
SELECT 
     A.학교코드,
     B.반코드,
     D.이름                                                   
 FROM  A                                      
 LEFT OUTER JOIN B                                
 ON( A.학교코드 = B.학교코드)
 LEFT OUTER JOIN  (SELECT 반코드 ,이름 ,ROW_NUMBER() OVER(ORDER BY 성적 DESC) AS 성적_SEQ FROM C ) D 
 ON (B.반코드 = D.반코드 AND D.성적_SEQ=1)
 WHERE A.학교코드 = 'A'; 

학교코드는 A기준으로 뽑았습니다


by 우리집아찌 [2018.07.20 09:02:01]

A 테이블은 조인안하셔도 되고요

OUTER JOIN 도 불필요해 보입니다.


by 우리집아찌 [2018.07.20 09:00:34]
-- 새치기 ㅎㅎㅎ
-- A TABLE은 굳이 JOIN 안하셔도 됩니다.
WITH A AS (
SELECT 'A' AS SCHOOL_CODE FROM DUAL UNION ALL
SELECT 'B' AS SCHOOL_CODE FROM DUAL 
) , B AS (
SELECT 'A' AS SCHOOL_CODE , 'A1' CLASS_CODE FROM DUAL UNION ALL
SELECT 'A' AS SCHOOL_CODE , 'A2' CLASS_CODE FROM DUAL UNION ALL
SELECT 'B' AS SCHOOL_CODE , 'B1' CLASS_CODE FROM DUAL
) , C AS (
SELECT 'A1' AS CLASS_CODE , 90 SCORE , '김일' NM , '20180718' DT FROM DUAL UNION ALL
SELECT 'A1' AS CLASS_CODE , 90 SCORE , '김DL' NM , '20180716' DT FROM DUAL UNION ALL
SELECT 'A1' AS CLASS_CODE , 50 SCORE , '김삼' NM , '20180707' DT FROM DUAL UNION ALL
SELECT 'A2' AS CLASS_CODE , 80 SCORE , '김사' NM , '20180707' DT FROM DUAL UNION ALL
SELECT 'A2' AS CLASS_CODE , 90 SCORE , '김오' NM , '20180707' DT FROM DUAL UNION ALL
SELECT 'B1' AS CLASS_CODE , 40 SCORE , '김육' NM , '20180707' DT FROM DUAL 
)
SELECT SCHOOL_CODE , CLASS_CODE , NM
  FROM (SELECT A.SCHOOL_CODE 
             , A.CLASS_CODE 
             , B.NM
             , ROW_NUMBER() OVER(PARTITION BY A.CLASS_CODE ORDER BY B.SCORE DESC ) RN 
          FROM B A 
             , C B
         WHERE A.CLASS_CODE = B.CLASS_CODE
           AND A.SCHOOL_CODE = 'A'
        )
  WHERE RN = 1 

 


by 김재현 [2018.07.20 15:22:13]

감사합니다. PARTITION BY를 쓰니 제가 원하는 방향으로 잘 나오네요


by 마농 [2018.07.23 08:01:45]

정렬기준은 유니크하게 설정해 주셔야 합니다.
동점이 가능한 성적 외에 추가 정렬이 필요합니다.
동점인 김일과 김이중에 누가 나와야 할지를 명확하게 해주시는게 좋습니다.
예) ORDER BY 성적 DESC, 등록일 DESC, 이름ASC

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입