问题描述
我们有一个包含几列的 sql 表,其中一列是 Item。它具有如下所示的各种值。
项目 |
---|
项目 1 |
Item2 |
Item3 |
Item4 |
Item5 |
Item6 |
Item7 |
Item8 |
Item9 |
Item10 |
Item11 |
Item12 |
我需要根据表中的总行数将这个表分成不同的集合。 允许的最大组数有所不同,但例如,这里我将其用作 6。
所以,如果表中有 12 行,我需要将 batch1 分配给前 2 行,将 batch2 分配给第 3/4 行,依此类推。如果有 14 行,最后 4 行可以有 batch6(因为 14 / 6 = 每批大约 2 行)
到目前为止我尝试的是在 Item 上使用 row_number 以便我得到一个唯一的行列表(Item 在这个表中将是唯一的,在这个例子中它将是 1 到 12)。然后编写基于游标的逻辑来循环计数,并根据因子 6,设置 BatchName 的值。
期望的输出是
项目 | 批次名称 |
---|---|
项目 1 | 第一批 |
Item2 | 第一批 |
Item3 | 第二批 |
Item4 | 第二批 |
Item5 | 第三批 |
Item6 | 第三批 |
Item7 | 第 4 批 |
Item8 | 第 4 批 |
Item9 | 第 5 批 |
Item10 | 第 5 批 |
Item11 | 第 6 批 |
Item12 | 第 6 批 |
这里最好的选择是什么?有什么建议可以产生这种类型的输出吗?
非常感谢。
解决方法
只需使用算术。在 SQL Server 中,您可以使用:
select t.*,( (row_number() over (order by item) + 1) / 2 ) as batch_number
from t