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且组数为5,则前三个组将具有11行,其余两个组将分别具有10行。另一方面,如果总行数可以被组的数量整除,则行将在各组之间均匀分布。例如,如果总行数为50,并且有五个组,则每个存储桶将包含10行。
在 SQL Fiddle 中清楚地证明了这一点。第4组,第5组,第6组各有4行,其余各有5条。我有一些开始一些解决方案,但它们变得冗长,我觉得我错过了一些东西,这可以在一行中完成。< / p>
答案 0 :(得分:6)
您可以使用:
;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()
。但如果不是这样,那么这个答案也有效。 Here is修改后的sqlfiddle。
答案 1 :(得分:4)
有点数学可以走很长的路。从所有值中减去1会将5s(边缘情况)放入此处的前一个组中,并将6s放入下一个组中。按照您的团队规模对分部进行分区,然后添加一个分组,即可获得您正在寻找的结果。此外,这里的SQLFiddle示例修复了您的迭代插入 - 该表仅上升到了27。
SELECT col1,
floor((col1-1)/5)+1 as grpNum
FROM tableA