表A
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
第六组应该有2行。NTILE无法完成我想要的操作,因为如果无法将它们整除,则NTILE会处理这些组。
如果分区中的行数不能被integer_expression整除,则将导致两个大小的组之间有一个成员不同。较大的组按照OVER子句指定的顺序排在较小的组之前。例如,如果行的总数为53,而组的数目为5,则前三个组将具有11行,而其余两个组将分别具有10行。另一方面,如果总行数可被组数整除,则行将平均分布在组中。例如,如果总行数为50,并且有五个组,则每个存储桶将包含10行。
这在 SQL Fiddle 中得到了明显证明。第4、5、6组每个都有4行,其余的则有5行。我已经开始了一些解决方案,但是他们变得冗长,我觉得我缺少了一些东西,可以在一行中完成。
最佳答案
您可以使用此:
;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。