sort 질문드립니다. 0 9 870

by 도담 [SQL Query] sort 소트 [2017.03.07 20:16:53]


예1)       예2)      
RN GP 순서   RN GP 순서  
1 A T1   1 A T1  
2 A T2   2 A T2  
3 A T1   3 A T3  
4 A T2   4 A T1  
5 A T1   5 A T2  
6 A T2   6 A T3  
1 B T2   1 B T2  
2 B T1   2 B T3  
3 B T2   3 B T1  
4 B T1   4 B T2  
5 B T2   5 B T3  
6 B T1   6 B T1  
1 C T1   1 C T3  
2 C T2   2 C T2  
3 C T1   3 C T1  
4 C T2   4 C T3  
5 C T1   5 C T1  
6 C T2   6 C T2  
               

RN 그룹으로 반복될때 마다 순서가 한번식 바뀔수 있는지..

순서가 2개가 있는경우 T1 T2 / T2 T1 / T1 T2 이런식이고

순서가 3개 있는 경우 T1 T2 T3 / T2 T3 T1 / T3 T2 T1 / T1 T2 T3 / .......

가능한지요? 아무리 해봐도 안나옵니다. ㅜㅜ

 

with t
as (
    select '1' RN , 'A' GP, 'T1' ST  from dual union all
    select '2' , 'A', 'T2' from dual union all
    select '3' , 'A', 'T1' from dual union all
    select '4' , 'A', 'T2' from dual union all
    select '5' , 'A', 'T1' from dual union all
    select '6' , 'A', 'T2' from dual union all
    select '1' , 'B', 'T1' from dual union all
    select '2' , 'B', 'T2' from dual union all
    select '3' , 'B', 'T1' from dual union all
    select '4' , 'B', 'T2' from dual union all
    select '5' , 'B', 'T1' from dual union all
    select '6' , 'B', 'T2' from dual union all
    select '1' , 'C', 'T1' from dual union all
    select '2' , 'C', 'T2' from dual union all
    select '3' , 'C', 'T1' from dual union all
    select '4' , 'C', 'T2' from dual union all
    select '5' , 'C', 'T1' from dual union all
    select '6' , 'C', 'T2' from dual   
)

by 마농 [2017.03.07 20:43:20]
WITH t AS
(
SELECT 'A' gp FROM dual
UNION ALL SELECT 'A' FROM dual
UNION ALL SELECT 'A' FROM dual
UNION ALL SELECT 'A' FROM dual
UNION ALL SELECT 'A' FROM dual
UNION ALL SELECT 'A' FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'B' FROM dual
UNION ALL SELECT 'C' FROM dual
UNION ALL SELECT 'C' FROM dual
UNION ALL SELECT 'C' FROM dual
UNION ALL SELECT 'C' FROM dual
UNION ALL SELECT 'C' FROM dual
UNION ALL SELECT 'C' FROM dual 
)
SELECT rn
     , gp
     , 'T' || (MOD(rn + dr - 2, n) + 1) st
  FROM (SELECT gp
             , DENSE_RANK() OVER(ORDER BY gp) dr
             , ROW_NUMBER() OVER(PARTITION BY gp ORDER BY 1) rn
             , 3 n    -- 테스트 값 조정
          FROM t
        )
;

 


by 도담 [2017.03.07 21:02:47]

감사합니다. 해결의 실마리를 찾은듯합니다.


by 도담 [2017.03.07 22:04:08]

다시한번 부탁드립니다

ST컬럼이 수정이 안되고 RN 컬럼을 변경하는 방법은 없을까요?

123456 / 612345 / 651234

어렵네요..


by 마농 [2017.03.07 22:13:39]

일관성이 없어보이는데요?
처음 질문과 결과가 완전 다른데요?
st 의 값은 아무 상관 없는 것인지?
rn 만 정렬하면 되는지?
처음 질문의 연장선인지? 아니면 완전 새로운 질문인지?
예시 데이터를 일관성 있게 다시 해주셔야 할 듯.


by 도담 [2017.03.07 22:17:30]

앗 죄송합니다. 수정하려고 했는데 벌써 답변을 주셨네요

123456 612345 561234 456123..

입니다


by jkson [2017.03.08 08:40:39]

본문 내용하고 다른 것 같은데.. 뭔가 새로운 값을 만들어 내는 것이 아니라 말씀하신 순서대로 sort를 원하시는 것 맞나요?

with t
 as (
     select '1' RN , 'A' GP, 'T1' ST  from dual union all
     select '2' , 'A', 'T2' from dual union all
     select '3' , 'A', 'T1' from dual union all
     select '4' , 'A', 'T2' from dual union all
     select '5' , 'A', 'T1' from dual union all
     select '6' , 'A', 'T2' from dual union all
     select '1' , 'B', 'T1' from dual union all
     select '2' , 'B', 'T2' from dual union all
     select '3' , 'B', 'T1' from dual union all
     select '4' , 'B', 'T2' from dual union all
     select '5' , 'B', 'T1' from dual union all
     select '6' , 'B', 'T2' from dual union all
     select '1' , 'C', 'T1' from dual union all
     select '2' , 'C', 'T2' from dual union all
     select '3' , 'C', 'T1' from dual union all
     select '4' , 'C', 'T2' from dual union all
     select '5' , 'C', 'T1' from dual union all
     select '6' , 'C', 'T2' from dual   
 )
 select rn, gp, st
   from
     (
     select rn, gp, st
          , dense_rank() over(order by gp) gprank
          , count(1) over (partition by gp) gpcnt
       from t
     )
  order by gp, decode(mod(rn + gprank - 1, gpcnt),0,gpcnt,mod(rn + gprank - 1, gpcnt))

 

 


by 마농 [2017.03.09 09:27:09]

간결하게
 - 변경전 : order by gp, decode(mod(rn + gprank - 1, gpcnt),0,gpcnt,mod(rn + gprank - 1, gpcnt))
 - 변경후 : order by gp, mod(rn + gprank - 2, gpcnt)


by jkson [2017.03.09 09:52:12]

아! 맞네요. 왜 sort값이 1부터 시작해야된다고 생각한 건지ㅋㅋ 역시 스마트하십니다.


by 도담 [2017.03.08 09:22:16]

너무너무 감사드립니다.

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