#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;