안녕하세요.
현재 mariadb 10.1 대 버전을 사용 하고 있습니다.
ntile 함수를 이용해서 리스트 결과를 묶음 처리 하고 싶은데
검색해보니 10.2대 버전부터 ntile 함수를 제공 하더라구요
해서 프로그램에서 구현할까 했다가 쿼리에서 해볼까 하고
select m.seq
, m.rownum
, ceil(m.rownum / ceil(@ROWNUM / 3)) as grpId /* 묶을 갯수 */
FROM (
SELECT a.seq
, @ROWNUM := @ROWNUM +1 rownum
FROM (
select 1 seq
union all select 2
union all select 3
union all select 4
union all select 5
union all select 6
union all select 7
union all select 8
union all select 9
union all select 10
) a
, (select @ROWNUM:=0) R
) m
;
이렇게 해봤습니다.
묶을 갯수를 2로 하면 5개 로우씩 묶을수 있지만
묶을 갯수를 3, 4로 하면 로우 갯수 차이는 있지만 원하는 묶을갯수가 나왔는데요
묶을 갯수가 6부터는 묶음 갯수가 원한는데로 안나와서요
혹시 ntile처럼 묶음 처리할수 있는 방법이 있을까요??
SELECT seq , rn , cnt , n , CASE WHEN rn <= v_m * v_c THEN CEIL(rn / v_c) ELSE CEIL((rn - v_m) / v_f) END nt FROM (SELECT seq , rn -- 순번 , @rn AS cnt -- 전체 건수 , n -- 전체 그룹 수 , MOD (@rn , n) v_m -- 큰 그룹 수 , CEIL (@rn / n) v_c -- 큰 그룹 구성원 수 , FLOOR(@rn / n) v_f -- 작은 그룹 구성원 수 FROM (SELECT seq , @rn := @rn + 1 rn , n FROM (-- 데이터는 정렬되어 있지 않음 SELECT 1 seq UNION ALL SELECT 2 UNION ALL SELECT 4 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 8 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 3 UNION ALL SELECT 7 ) a , (SELECT @rn := 0, 6 n) b ORDER BY seq -- 데이터 정렬 필요 ) a ) a ;