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