Sql 将行分组为5组 表
我想添加第二列,为5人组分配一个数字 结果 第6组应该有2行 NTILE不能实现我想要的,因为如果组不能被整数整除,NTILE处理组的方式 如果分区中的行数不能被整数_表达式整除,这将导致两个大小的组相差一个成员。按照OVER子句指定的顺序,较大的组位于较小的组之前。例如,如果总行数为53,组数为5,则前三个组将有11行,其余两个组各有10行。另一方面,如果总行数可被组数整除,则行数将均匀分布在组中。例如,如果总行数为50,并且有五个组,则每个bucket将包含10行 这在本中得到了明确的证明。第4、5、6组各有4行,其余各有5行。我已经开始了一些解决方案,但它们越来越长,我觉得我遗漏了一些东西,这可以在一行中完成。您可以使用以下方法:Sql 将行分组为5组 表,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我想添加第二列,为5人组分配一个数字 结果 第6组应该有2行 NTILE不能实现我想要的,因为如果组不能被整数整除,NTILE处理组的方式 如果分区中的行数不能被整数_表达式整除,这将导致两个大小的组相差一个成员。按照OVER子句指定的顺序,较大的组位于较小的组之前。例如,如果总行数为53,组数为5,则前三个组将有11行,其余两个组各有10行。另一方面,如果总行数可被组数整除,则行数将均匀分布在组中。例如,如果总行数为50,并且有五个组,则每个bucket将包含10行 这在本中得到了明确的证明。
;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
),而无需使用行编号()。但如果不是,那么这个答案也适用。修改后的sqlfiddle。一点数学知识可以大有帮助。从所有值中减去1会将5(边缘案例)放入上一组,将6放入下一组。根据您的团队规模对部门进行布局,并添加一个,即可得到您想要的结果。此外,这里的示例修复了您的迭代插入-表格只增加到27
SELECT col1,
floor((col1-1)/5)+1 as grpNum
FROM tableA
我只需要第二双眼睛。我开始疯狂地玩mod和rownumber()。
;WITH CTE AS
(
SELECT col1,
RN = ROW_NUMBER() OVER(ORDER BY col1)
FROM TableA
)
SELECT col1, (RN-1)/5+1 col2
FROM CTE;
SELECT col1,
floor((col1-1)/5)+1 as grpNum
FROM tableA