Contents

[-]
1 개요
2 소스
3 다차원 모델에서 써먹는 방법


1 개요 #

우리는 자주 1~10, 11 ~ 20, 21 ~ 30 ... 과 같이 구간 그룹핑을 요청받고는 한다. 그러면 편하게 case when num between 1 and 10 .. 과 같이 case when을 사용하여 쪼개는 경우가 많이 있다. 구간 그룹핑을 했다는 의미는 구간의 중앙값이 평균 또는 메디안 정도로가 된다는 의미가 숨어 있기도 하다.(예: 1 ~ 10 은 5) 만약 감에 의존하여 아무 생각없이 쪼갰다면 당연히 구간의 값이 변경(1 ~ 10 -> 1 ~ 5, 6 ~10)될 가능성이 매우 크다는 의미이고, 이것은 곧 유지보수 비용으로 반영된다. 이러한 변화에 대처하는 쿼리를 소개하고자 한다. 단, 이 솔루션은 각 구간의 폭이 같다는 가정하에서만 적용된다.

2 소스 #

declare @unit int;
set @unit = 5 -- 쪼갤단위

;with samples
as
(
        select 0 rowno
        union all
        select rowno + 1 from samples
        where rowno + 1 <= 1000
)
select  
	convert(varchar(50), (rowno-1) / @unit * @unit + 1) + ' ~ ' + convert(varchar(50), (rowno-1) / @unit * @unit + @unit) width
,	rowno
from samples
option (maxrecursion 0)

3 다차원 모델에서 써먹는 방법 #

아래는 DW의 다차원 모델에서 fact의 구간대 모델 같은거에 쓰면 된다. 통계적인 부분까지 들어가면 이걸로는 안 된다. 히스토그램을 그려보고, 정규분포를 만들기 위해 로그변환 등을 해야 할 수도 있다. 중요한 것은 의미있게 자르는 것이다. 그냥 분포를 볼 목적이라면 구간을 크게 자른 것을 가지고 점점 파고 들어가는 방법(이게 분석이다!)을 사용하면 된다. 이는 아래의 솔루션으로 해결 가능하다.
;with samples
as
(
        select 0 rowno
        union all
        select rowno + 1 from samples
        where rowno + 1 <= 10000
)
select  
	convert(varchar(50), (rowno-1) / 1000 * 1000 + 1) + ' ~ ' + convert(varchar(50), (rowno-1) / 1000 * 1000 + 1000) width
,	convert(varchar(50), (rowno-1) / 500 * 500 + 1) + ' ~ ' + convert(varchar(50), (rowno-1) / 500 * 500 + 500) width
,	convert(varchar(50), (rowno-1) / 100 * 100 + 1) + ' ~ ' + convert(varchar(50), (rowno-1) / 100 * 100 + 100) width
,	convert(varchar(50), (rowno-1) / 50 * 50 + 1) + ' ~ ' + convert(varchar(50), (rowno-1) / 50 * 50 + 50) width
,	convert(varchar(50), (rowno-1) / 10 * 10 + 1) + ' ~ ' + convert(varchar(50), (rowno-1) / 10 * 10 + 10) width
,	convert(varchar(50), (rowno-1) / 5 * 5 + 1) + ' ~ ' + convert(varchar(50), (rowno-1) / 5 * 5 + 5) width
,	rowno
from samples
option (maxrecursion 0)
Retrieved from http://test.databaser.net/moniwiki/wiki.php/숫자의그룹화
last modified 2018-04-13 23:12:53