Обновите значения столбца как сгруппированный порядковый номер на основе номера ввода, предоставленного в sql Server

#sql

#sql

Вопрос:

Я хочу обновить столбец batch здесь

    ID   CustId  Batch
    1   100     NULL
    2   101     NULL
    3   102     NULL
    4   103     NULL
    5   104     NULL
    6   105     NULL
    7   106     NULL
    8   107     NULL
    9   108     NULL
    10  109     NULL
    11  110     NULL
  

На основе предоставленного номера ввода, допустим, у меня есть ввод 2.
Логика здесь заключается в том, чтобы разделить количество записей на номер ввода. В этом случае он становится 11/2 = 5,5

Результат должен выглядеть следующим образом

   ID    CustId  Batch
    1   100     1
    2   101     1
    3   102     2
    4   103     2
    5   104     3
    6   105     3
    7   106     4
    8   107     4
    9   108     5
    10  109     5
    11  110     6
  

Пожалуйста, предложите SQL-запрос для этого.

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

1. Пометьте свой вопрос используемой базой данных.

Ответ №1:

Приведенный ниже код сгенерирует требуемый результат. Причина принятия @input как ДЕСЯТИЧНОГО в том, что он будет учитывать десятичные значения, а не просто округление до значения INT.

  DECLARE @input DECIMAL = 2;
    WITH CTE AS (
      SELECT t.ID, ROW_NUMBER() OVER (ORDER BY ID) AS rowNo
      FROM Table t
    )
    UPDATE t
        SET Batch = CEILING( c.rowNo / @input)
        FROM Table t
        INNER JOIN CTE c
          ON t.ID = c.ID
        

To check the output before running Update

    -- DECLARE @input DECIMAL = 2
    -- SELECt t.*, CEILING( ROW_NUMBER() OVER (ORDER BY ID) / @input) as NewBatch
    --      FROM
    --      Table t
  

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

1. Это хорошо работает для вышеуказанных данных, если столбец ID находится в последовательности. Нужен приведенный выше результат с логикой — Разделите количество записей на номер ввода вместо идентификатора.

2. @RajP, отредактировал мой предыдущий ответ. Спасибо за ваше предложение

3. Спасибо за ответ. Запрос Select работает нормально, но обновление выдает ошибку, поскольку оконные функции могут отображаться только в предложениях SELECT или ORDER BY. Необходимо обновить

4. @RajP, проверьте сейчас

Ответ №2:

Одним из методов является:

 select t.*,
       ntile(ceiling(cnt / @n)) over (order by id) as batch
from (select t.*, count(*) over () as cnt
      from t
     ) t;
  

Другой метод:

 select t.*,
       floor( (row_number() over (order by id) - 1) / n) as batch
from t;