Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将行分组为5组 表_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 将行分组为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行 这在本中得到了明确的证明。

我想添加第二列,为5人组分配一个数字

结果 第6组应该有2行

NTILE不能实现我想要的,因为如果组不能被整数整除,NTILE处理组的方式

如果分区中的行数不能被整数_表达式整除,这将导致两个大小的组相差一个成员。按照OVER子句指定的顺序,较大的组位于较小的组之前。例如,如果总行数为53,组数为5,则前三个组将有11行,其余两个组各有10行。另一方面,如果总行数可被组数整除,则行数将均匀分布在组中。例如,如果总行数为50,并且有五个组,则每个bucket将包含10行

这在本中得到了明确的证明。第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
),而无需使用
行编号()。但如果不是,那么这个答案也适用。修改后的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