将行分组为5组

SQL*_*hao 3 sql sql-server sql-server-2008-r2

表A

Col1
----------
1
2
3
4....all the way to 27
Run Code Online (Sandbox Code Playgroud)

我想添加第二列,为5个组分配一个数字.

结果

Col1         Col2
-----        ------
1            1
2            1
3            1
4            1
5            1
6            2
7            2
8            2...and so on
Run Code Online (Sandbox Code Playgroud)

第6组中应该有2行.

NTILE没有完成我想要的,因为NTILE处理组的方式如果它们不能被整数整除.

如果分区中的行数不能被integer_expression整除,则会导致两个大小的组相差一个成员.较大的组按OVER子句指定的顺序位于较小的组之前.例如,如果总行数为53且组数为5,则前三个组将具有11行,其余两个组将分别具有10行.另一方面,如果总行数可以被组的数量整除,则行将在各组之间均匀分布.例如,如果总行数为50,并且有五个组,则每个存储桶将包含10行.

这个SQL小提琴清楚地证明了这一点.第4组,第5组,第6组每组有4行,其余组有5行.我有一些开始一些解决方案,但它们变得冗长,我觉得我错过了一些东西,这可以在一行中完成.

Lam*_*mak 6

你可以用这个:

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

在您的样本数据中,col1是相关的无间隙,因此您可以直接使用它(如果它是INT)而不使用ROW_NUMBER().但如果不是这样,那么这个答案也有效.这是修改后的sqlfiddle.


Jaa*_*ole 5

有点数学可以走很长的路。从所有值中减去 1 将 5(边缘情况)放入此处的前一组,将 6 放入下一组。按您的组大小划分分区并添加一个会得到您正在寻找的结果。此外,此处的SQLFiddle示例修复了您的迭代插入 - 该表仅增加到 27。

SELECT col1,
  floor((col1-1)/5)+1 as grpNum
FROM tableA
Run Code Online (Sandbox Code Playgroud)