_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈
FrontPage › 부분정렬
sqler.com에 [http]재미있는 질문이 올라와 풀어봤다.

다음과 같은 테이블이 있다.
--drop table #temp
create table #temp(id int, sort_yn int)
insert #temp values(1,0),(2,0),(3,1),(4,1),(5,1),(6,1),(7,0),(8,1),(9,0)
select * from #temp

/*
id          sort_yn
----------- -----------
1           0
2           0
3           1
4           1
5           1
6           1
7           0
8           1
9           1
10          0
*/

위 테이블에서 다음과 같이 trnd = 1인 row들만 랜덤으로 정렬하고자 한다. 원하는 예를 들면 다음과 같다.
id          sort_yn
----------- -----------
1           0
2           0
5           1
6           1
4           1
3           1
7           0
9           1
8           1
10          0

다음과 같이 하면 된다.
select
    id
,   sort_yn
from (
    select 
        id
    ,   sort_yn
    ,   seq
    ,   row_number() over(partition by seq order by newid()) sort
    from (
        select
            id
        ,   case when sort_yn = 1 then min(id) over(partition by grp) else id end seq
        ,   sort_yn
        ,   grp
        from (
            select
                id
            ,   sort_yn 
            ,   row_number() over(order by id) - row_number() over(order by sort_yn, id) grp
            from #temp a
        ) t
    ) t
) t
order by seq, sort

댓글 남기기..
이름: : 오른쪽의 새로고침을 클릭해 주세요. 새로고침
EditText : Print : Mobile : FindPage : DeletePage : LikePages : Powered by MoniWiki : Last modified 2018-04-13 23:12:53

전깃불이 나간 어두운 방안에서 초가 있으면서도 초를 아끼느라 켜지 않는다면 어떻게 될까. 마찬가지로 한두 마디의 상냥한 말이면 상대방의 마음을 밝게 해 주고 유쾌한 분위기를 만들 수 있는데 그러지 않는다면 그것은 마치 초를 아끼기 위해 어둠 속에 있는 것과 같다. (T. 제퍼슨)