mariadb ntile 함수 구현 문의 0 2 108

by 쫀득이 [DB 기타] [2018.07.11 15:39:20]


안녕하세요.

현재 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처럼 묶음 처리할수 있는 방법이 있을까요??

 

by 마농 [2018.07.11 17:43:19]
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
;

 


by 쫀득이 [2018.07.11 18:17:33]

와~! 마농님 정말 감사 합니다.

주석도 다 달아 주셔서 이해하기가 수월 할거 같습니다.

답변 주셔서 감사 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입