SQL server:将一组行插入表中,生成一个;批次id“;每100美元?

SQL server:将一组行插入表中,生成一个;批次id“;每100美元?,sql,sql-server,Sql,Sql Server,我正在将一组行插入另一个表中,并观察为每插入X行生成一个唯一的批id(在本例中,X大约为100) 因此,如果我插入1000行,前100行的batch_id=1,下100行的batch_id=2,以此类推 INSERT INTO BatchTable(batch_id, col1) SELECT batchId, col1 //how to generate batchId??? FROM OtherTable 使用row\u number()函数尝试此操作: declare @batchGro

我正在将一组行插入另一个表中,并观察为每插入X行生成一个唯一的批id(在本例中,X大约为100)

因此,如果我插入1000行,前100行的batch_id=1,下100行的batch_id=2,以此类推

INSERT INTO BatchTable(batch_id, col1)
SELECT batchId, col1 //how to generate batchId???
FROM OtherTable

使用
row\u number()
函数尝试此操作:

declare @batchGroup int = 100

Insert into BatchTable(batch_id, col1)
Select ((row_number() over (order by col1)-1)/@batchGroup)+ 1 As batch_id, col1
From OtherTable

使用
row\u number()
函数尝试此操作:

declare @batchGroup int = 100

Insert into BatchTable(batch_id, col1)
Select ((row_number() over (order by col1)-1)/@batchGroup)+ 1 As batch_id, col1
From OtherTable

我们可以在这里利用整数除法,以一种简单的方式将其四舍五入到下一个100:

;WITH x AS 
(
  SELECT col1, rn = ROW_NUMBER() OVER (ORDER BY col1) FROM dbo.OtherTable
)
--INSERT dbo.BatchTable(batch_id, col1)
SELECT batch_id = (99+rn)/100, col1 FROM x;

当您对输出感到满意时,取消注释
插入
..

我们可以利用整数除法,以一种简单的方式将其四舍五入到下一个100:

;WITH x AS 
(
  SELECT col1, rn = ROW_NUMBER() OVER (ORDER BY col1) FROM dbo.OtherTable
)
--INSERT dbo.BatchTable(batch_id, col1)
SELECT batch_id = (99+rn)/100, col1 FROM x;

当您对输出感到满意时,取消对
插入的注释
..

我知道这是一个老问题,但我遇到了同样的情况。然而,在我的例子中,通过引入任何类型的顺序都会阻止并行性,并导致索引丢失或在查询计划中引入昂贵的排序步骤

在我的表中,我有一个整数唯一键列(称之为account_id),我不关心批的顺序或每个批的确切大小,但我需要在整个行集合中按顺序编号(例如1-100),所以我做了以下操作:

INSERT INTO TABLE_1 (batch_id, account_id)
SELECT (account_id / 100) + 1, account_id 
FROM Account_Table
随着时间的推移和数据的增长,我可能需要将100更改为1000或10000或其他任何值,但对于我来说,这是完成任务最简单/最便宜的方法


编辑:已将%(mod)更改为/(整数除法),很抱歉造成混淆。

我知道这是一个较老的问题,但我遇到了同样的情况。然而,在我的例子中,通过引入任何类型的顺序都会阻止并行性,并导致索引丢失或在查询计划中引入昂贵的排序步骤

在我的表中,我有一个整数唯一键列(称之为account_id),我不关心批的顺序或每个批的确切大小,但我需要在整个行集合中按顺序编号(例如1-100),所以我做了以下操作:

INSERT INTO TABLE_1 (batch_id, account_id)
SELECT (account_id / 100) + 1, account_id 
FROM Account_Table
随着时间的推移和数据的增长,我可能需要将100更改为1000或10000或其他任何值,但对于我来说,这是完成任务最简单/最便宜的方法


编辑:已将%(mod)更改为/(整数除法),很抱歉出现任何混淆。

我将执行
插入操作,然后执行
更新操作
。那么您将如何更新batchId?将其保留为
NULL
,然后使用
CTE执行
更新操作
,我将执行
插入操作
,然后执行
更新
。那么您将如何更新batchId?将其保留为
NULL
,然后使用
CTE执行
更新
,如果我还需要将col1、col2和col3插入表中该怎么办?如果是(col1订购)有关系吗?@Henley只有你能回答这个问题。您想按任何特定顺序枚举批次吗?如果是,则使用该选项来订购。如果没有,那么没有关系。您只需要将其他列添加到内部和外部查询中。(下次,请问一个完整的问题,而不是把它简单化,以排除一些对你显然重要的细节。)谢谢Aaron。隐马尔可夫模型。。如果我希望批次id从一个数字开始递增,该怎么办?因此,如果最大批次id为100,那么下次我进行插入时,批次id以101开始?@Henley然后使用
选择批次\u id=100+(99+rn)/100,…
如果我还需要将col1、col2和col3插入表中该怎么办?如果是(col1订购)有关系吗?@Henley只有你能回答这个问题。您想按任何特定顺序枚举批次吗?如果是,则使用该选项来订购。如果没有,那么没有关系。您只需要将其他列添加到内部和外部查询中。(下次,请问一个完整的问题,而不是把它简单化,以排除一些对你显然重要的细节。)谢谢Aaron。隐马尔可夫模型。。如果我希望批次id从一个数字开始递增,该怎么办?因此,如果最大批次id为100,那么下次我进行插入时,批次id以101开始?@Henley,然后使用
选择批次id=100+(99+rn)/100,…