将行分组为5组

时间:2014-08-21 21:21:40

标签: sql sql-server sql-server-2008-r2

表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,并且有五个组,则每个存储桶将包含10行。

SQL Fiddle 中清楚地证明了这一点。第4组,第5组,第6组各有4行,其余各有5条。我有一些开始一些解决方案,但它们变得冗长,我觉得我错过了一些东西,这可以在一行中完成。< / p>

2 个答案:

答案 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