表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
第 6 组应该有 2 行。NTILE 不能完成我想要的,因为 NTILE 处理组的方式,如果它们不能被整数整除。
如果分区中的行数不能被 integer_expression 整除,这将导致两个大小的组的一个成员不同。较大的组按照 OVER 子句指定的顺序排在较小的组之前。例如,如果总行数为 53,组数为 5,则前三组将有 11 行,其余两个组将各有 10 行。另一方面,如果总行数可被组数整除,则行将均匀分布在组中。例如,如果总行数为 50,并且有 5 个组,则每个存储桶将包含 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。
关于sql - 将行分组为 5 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25436141/