sql - 将行分组为 5 组

标签 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,并且有 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/

相关文章:

sql - SQL SERVER中 "&"运算符有什么用

SQL Server : Function Evaluation Time

sql-server - 存储过程缓存清除和执行时间

sql - 如何找到最大平均值

mysql - 在 MySQL 的一个表中存储 100 多个列的最佳方法

sql - 与 UDF 交叉应用

c# - 捕获数据库约束错误的最佳方法

php - 在单个查询中根据不同的连接从不同的表中获取数据

reporting-services - 列出 SQL Server 2008 R2 中的所有数据源及其依赖关系(报告、项目等)

sql-server - 每个用户表都应该有聚集索引吗?