복붙노트

[SQL] 5 세트로 그룹 행

SQL

5 세트로 그룹 행

Col1
----------
1
2
3
4....all the way to 27

나는 5의 그룹 번호를 할당하는 두 번째 열을 추가 할 수 있습니다.

Col1         Col2
-----        ------
1            1
2            1
3            1
4            1
5            1
6            2
7            2
8            2...and so on

제 6 회 그룹은 2 개 행이 있어야합니다.

NTILE은 정수로 나누어없는 경우 방식 NTILE이 그룹을 핸들하기 때문에 내가 원하는 것을 달성하지 않습니다.

파티션의 행수가 integer_expression의 배수가 아닌 경우, 이것은 하나의 부재로 두 가지 크기의 차이가 그룹을 일으킬 것이다. 큰 그룹은 OVER 절에 지정된 순서로 작은 그룹 전에 온다. 예를 들어, 행의 총 수는 53이며, 그룹의 수는 세 그룹 제 11 개 행이되며, 나머지 두 그룹은 10 개의 행을 각각 가질 것이다 다섯이면. 행의 수는 그룹의 개수로 나누어 한편 경우 행 고르게 그룹 분산된다. 행의 총 수는 50이고, 5 개 그룹이있는 경우, 예를 들어, 각각의 버킷 (10 개)의 행을 포함 할 것이다.

이것은 명확하게 SQL 바이올린에서 입증된다. 나머지는 좀 그들이 긴지고 있었다 나는 이것이 하나의 라인에서 수행 될 수 있다는 내가 뭔가 빠진 것 같은 느낌이 어떤 해결책을 시작했지만 한 5있는 동안 그룹 4, 5, 6은 각각 4 개 행을 가지고있다.

해결법

  1. ==============================

    1.당신은이를 사용할 수 있습니다 :

    당신은이를 사용할 수 있습니다 :

    ;WITH CTE AS
    (
        SELECT col1,
               RN = ROW_NUMBER() OVER(ORDER BY col1)
        FROM TableA
    )
    SELECT col1, (RN-1)/5+1 col2
    FROM CTE;
    

    샘플 데이터에서 COL1은 (그것이 INT의 경우)) (ROW_NUMBER를 사용하지 않고 직접 사용할 수 있도록, 차이가없는 상관 관계이다. 그러나이 아니라고 경우,이 대답은 너무 작동합니다. 다음은 수정 된 sqlfiddle입니다.

  2. ==============================

    2.수학의 비트 먼 길을 갈 수 있습니다. 모든 값에서 1을 뺀 여기서 이전 그룹에 5S (에지의 경우)를두고, 그 다음에 6 개있다. 그룹의 크기에 의해 분할을 바닥과 하나가 당신이 찾고있는 결과를 제공 추가. 또한, SQLFiddle 예를 들어 여기에 반복 삽입을 수정 - 테이블은 27까지 갔다.

    수학의 비트 먼 길을 갈 수 있습니다. 모든 값에서 1을 뺀 여기서 이전 그룹에 5S (에지의 경우)를두고, 그 다음에 6 개있다. 그룹의 크기에 의해 분할을 바닥과 하나가 당신이 찾고있는 결과를 제공 추가. 또한, SQLFiddle 예를 들어 여기에 반복 삽입을 수정 - 테이블은 27까지 갔다.

    SELECT col1,
      floor((col1-1)/5)+1 as grpNum
    FROM tableA
    
  3. from https://stackoverflow.com/questions/25436141/group-rows-into-sets-of-5 by cc-by-sa and MIT license