DENSE_RANK() OVER (PARTITION BY 헷갈리네요. ㅠ.ㅠ 0 4 724

by 유환 [SQL Query] [2020.03.03 01:25:00]


안녕하세요..

랭크 구하는 원도우함수 와  WHERE 다음의 ORDER BY 같이 쓰면 헷갈리네요.

원본 데이터 
A   B   C
--------------------
3    1    1
2    3    3
2    2    1
2    1    2
2    1    1
1    2    1
1    1    2
1    1    1

 
 SELECT X.*
      , DENSE_RANK() OVER (PARTITION BY A ORDER BY B) RN
   FROM (
         SELECT A, B, DECODE(C, 1, 0, C)
           FROM TEST A
          ORDER BY A,B, DECODE(C, 1, 0, C)
        ) X
   ;

이렇게 했을때 안쪽에서 오더바이 A,B,C 정렬순으로 한번 감싸도 유지가 되나요?
랭크함수에는 A,B 컬럼 만으로 정렬하는대요, C컬럼도 안쪽의 정렬순으로 유지가 되나요??
데이터가 많지 않아서 되는거 같기는 한대 좀 헷갈리네요.

by 마농 [2020.03.03 09:05:01]

정렬은 항상 최종 정렬만 유효합니다.
중간 정렬결과가 유지 될 수도 있고 안될 수도 있고 보장이 안됩니다.
분석함수도 정렬이 되긴 하지만 완벽하게 보장은 안됩니다.
확실한 정렬을 원한다면? 최종 마지막에 정렬 구문 추가하세요.
DECODE 구문은 불필요해 보입니다.


by 유환 [2020.03.03 12:10:49]

감사합니다.

오더바이는 a,b,c 로 최종 정렬하고 , DENSE_RANK() OVER (PARTITION BY A ORDER BY B) RN 요렇게 랭킹을 먹일려고했는대

오더바이 때문에 랭킹이 틀어지기도하고 , 맞기도 하고 그러네요;;

오더바이와 같이 쓰려니 잘 안되네요.


by 마농 [2020.03.03 13:05:22]

제가 말한 최종 정렬은 OVER 안의 ORDER BY 를 말하는게 아니죠.
전체 쿼리에 대한 ORDER BY 를 별도로 추가해야죠.

SELECT a, b, c
     , DENSE_RANK() OVER (PARTITION BY a ORDER BY b) dr  -- 중간 정렬(a, b)
  FROM test
 ORDER BY a, b, c                                        -- 최종 정렬(a, b, c)
;

 


by 유환 [2020.03.03 23:15:52]

감사합니다. 

최종정렬 a,b,c이고  중간정열도 a,b 이며 c는 랭크 먹일때 의미 없으므로 마농님 처럼 하면 되겟네요.

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