문제 #

데이터가 이 모양이다.
seq	h
1	중분류1
2	소분류1
3	소분류2
4	소분류3
5	중분류2
6	소분류4
7	중분류3
8	소분류5

아래와 같은 결과를 얻고 싶다.
seq	h
2	소분류1
3	소분류2
4	소분류3
1	중분류1
6	소분류4
5	중분류2
8	소분류5
7	중분류3
--질문 출처: http://www.sqler.com/bSQLQA/745455

문제 분석 #

RDB의 특징 중에 하나가 투플의 무순서다. 즉, 순서는 relationship 아니다. 제대로 되려면 relationship에 대한 데이터가 있어야 한다. 위의 예제로 본다면 소분류1, 소분류2, 소분류3는 중분류1과의 relationship이 데이터로 존재하여야 한다. 그런데도 불구하고 굳이 어거지로 해보겠다면 중분류 식별이 가능하다는 가정하에 다음과 같이 해볼 수 있다.


SQL #

데이터 만들기
select 1 seq, '중분류1' h into #temp union all
select 2, '소분류1' union all
select 3, '소분류2' union all
select 4, '소분류3' union all
select 5, '중분류2' union all
select 6, '소분류4' union all
select 7, '중분류3' union all
select 8, '소분류5' 

;with new_idx
as
(
    select
        h
    ,   seq
    ,   isnull(lead(seq, 1) over(order by seq), 99999) - 0.5 new_seq
    from #temp 
    where h like '중%'
)
select 
    a.seq
,   a.h
from #temp a
    left join new_idx b
        on a.seq = b.seq
order by 
    isnull(b.new_seq, a.seq)
Retrieved from http://databaser.net/moniwiki/wiki.php/정렬문제1
last modified 2018-04-13 23:12:53