首页 > 解决方案 > 按每个(批量)大小的 ID 对 SQL 结果进行分区

问题描述

我有一个来自 SQL 的记录集输出,我想在我们的生产中使用它,我想根据特定的批次大小用批次号识别每个生产订单 (prodid)。

样本数据(这里每个生产订单有一个项目,但每个生产订单可以是 X 个项目):

SET nocount ON
DECLARE @FirstTable TABLE (ProdId NVARCHAR(10), ItemID NVARCHAR(10))
DECLARE @ii INT


SET @ii = 1
WHILE @ii < 50
  BEGIN
    INSERT  INTO @FirstTable
    VALUES  ('P' + convert(varchar(10),@ii), 'I'+ convert(varchar(10),@ii * 10))
    SET @ii = @ii + 1
  END

SELECT  * FROM    @FirstTable 

例如,如果批次大小为 3,我希望每批次有 3 个生产订单,我需要的结果是:

在此处输入图像描述

例如,如果批次大小为 4,我希望每批次有 4 个生产订单,我需要的结果是:

在此处输入图像描述

当然,最后一批在大多数情况下都会小于批大小。谁能告诉我如何在 SQL 中做到这一点?

标签: sqlsql-server

解决方案


用于dense_rank()生成序列号ProdId。之后,使用以下表达式(SeqNo - 1) / @batch_size + 1获取您的BatchId

select  *, 
        BatchId = (SeqNo - 1) / @batch_size + 1
from
(
    select  *, 
            SeqNo = dense_rank() over (order by ProdId)
    from    yourtable
) d

推荐阅读