Разделите результат SQL по идентификатору на размер (пакета)

#sql #sql-server

#sql #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?

Комментарии:

1. Можете ли вы предоставить входные данные, потому что я не понимаю, откуда появляется ItemId, и я также не смог определить желаемую логику.

2. Спасибо, Сабхари, отредактировано..

Ответ №1:

используется dense_rank() для генерации последовательности no by 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
  

Комментарии:

1. Отлично! Спасибо, белка на миллион, ты спасатель 🙂