ORDER BY ? max 출력값 나타내기.. 0 5 2,484

by 윤 [2013.09.24 15:34:37]


 
WITH t AS (
   SELECT '1'A,'A'b,'00001'c,'같은내용'd FROM dual
   UNION SELECT '2','C','00001','같은내용' FROM dual
   UNION SELECT '1','C','00002','같 은 내 용' FROM dual
   UNION SELECT '2','B','00002','같 은 내 용' FROM dual
   UNION SELECT '3','A','00002','같 은 내 용' FROM dual
   UNION SELECT '1','A','00003','같은 내용' FROM dual
   UNION SELECT '2','C','00003','같은 내용' FROM dual
   union select '3','B','00003','같은 내용' from dual
   )
   SELECT * FROM t
   ;
   ;
--C컬럼 기준으로 a컬럼의 max값을 가져오면서 MAX값인 B의 데이터를 출력하는것입니다.

--나오는 출력 결과값은
--C컬럼  A  B   D
--
--00001  2   C  같은내용
--00002  3   A  같 은 내 용
--00003  3   B  같은 내용

--조언좀 부탁드립니다.
by 우리집아찌 [2013.09.24 15:45:26]
WITH t AS ( 
  SELECT '1'A,'A'b,'00001'c,'같은내용'd FROM dual 
  UNION SELECT '2','C','00001','같은내용' FROM dual 
  UNION SELECT '1','C','00002','같 은 내 용' FROM dual 
  UNION SELECT '2','B','00002','같 은 내 용' FROM dual 
  UNION SELECT '3','A','00002','같 은 내 용' FROM dual 
  UNION SELECT '1','A','00003','같은 내용' FROM dual 
  UNION SELECT '2','C','00003','같은 내용' FROM dual 
  union select '3','B','00003','같은 내용' from dual 
  ) 
 SELECT C 
    ,MAX(A) KEEP(DENSE_RANK FIRST ORDER BY C DESC) A
    ,MAX(B) KEEP(DENSE_RANK FIRST ORDER BY A DESC) B
    ,MAX(D) KEEP(DENSE_RANK FIRST ORDER BY C DESC) D
  FROM T
  GROUP BY C

by 마농 [2013.09.24 15:53:55]
-- 1. KEEP 을 이용하는 방법 --
-- d 가 c 에 종속적이라면 Group By c,d
-- 그렇지 않다면 Group By c 하고 d 도 KEEP 을 이용해 구함.
SELECT c
     , MAX(a) a
     , MAX(b) KEEP(DENSE_RANK LAST ORDER BY a) b
     , d
  FROM t
 GROUP BY c, d
 ORDER BY c
;
-- 2. Row_Number 를 이용하는 방법 --
SELECT c, a, b, d
  FROM (SELECT c, a, b, d
             , ROW_NUMBER() OVER(PARTITION BY c ORDER BY a DESC) rn
          FROM t
        )
 WHERE rn = 1
;

by 윤 [2013.09.26 13:50:35]
KEEP와 ROW_NUMBER 사용을 해보았는데...
ROW_NUMBER을 사용하는것이 더욱 간편한 것이네요 
KEEP를 사용하게되면 C와D가 같은데이터 경우 그룹바이가 되니..
만일에 같은데이터의 컬럼이 열개 이상인 경우 모두 그룹바이 해주어야하니...
ROW_NUMBER을 사용하게되면 더욱 편한거같은데....

마농님께서 알려주신 방법중 ROW_NUMBER 을 사용하게 되면 
KEEP을 사용했을때와의 문제점이 있을까요..? 

현재는 KEEP으로 수정하였는데...다시보니 
ROW_NUMBER을 사용하는것이 더 편할듯하여서...



PS.아...하나의 데이터라도 틀리면 값이 뒤바껴버리는군요...ROWNUM을 사용하게되면...
안전하게 KEEP을 사용하는게 나을듯네요 ㅜㅜ...
컬럼수가 좀 되다보니 ... 틀린값도 드분드분 보이네요;

ROWNUM의 파티션기준에 다른 데이터의 컬럼을 추가하면 되는군요 ~

by 마농 [2013.09.27 08:59:54]
두 함수의 성격이 약간 다르긴 합니다만...
말씀하신것처럼 뒤바뀌는 경우는 없다고 봐야 할 듯 합니다.
값이 뒤바뀌는 경우라면 정렬기준이 모호하고, 중복되는 경우라고 봐야죠.
이 경우는 둘중 뭐가 맞다라고 말할 수 없고
정렬기준을 중복되지 않도록 조정해주는 것이 맞습니다.
여러 항목에 Keep 을 하는 것보다는 row_number 를 이용하는게 편리합니다.

by 윤 [2013.09.24 16:03:32]
감사합니다 아찌님 마농님 ! 바로 해결 했습니다 . 
아찌님 마농님 1번을 응용하였습니다 

로우넘으로 이용하는방법도 생각해봐야겠네요 
감사합니다 ~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입