Если начальный BatchId указан пользователем, вы можете использовать переменную для изменения значения функции DENSE_RANK()
. Используя ваш набор данных, слегка рандомизированный, чтобы показать, что DENSE_RANK()
работает, я вставил следующее:
INSERT INTO BatchTest
(
Col1
,Col2
,Col3
,BatchId
)
VALUES
('A','B','C',0),
('A','B','C',0),
('A','B','E',0),
('A','B','C',0),
('A','B','D',0),
('A','B','D',0),
('A','B','D',0),
('A','B','C',0),
('A','B','E',0),
('A','B','E',0),
('A','B','D',0),
('A','B','E',0)
Затем вы можете использовать переменную для начального значения BatchId и изменить конечный запрос Zohar на UPDATE
, например, используя CTE для генерации значения BatchId и затем JOIN
, используя CTE для BatchTest:
DECLARE @BatchId INT = 34
;WITH BatchedIds AS
(
SELECT
ID
, Col1
, Col2
, Col3
, BatchId = ( DENSE_RANK() OVER ( ORDER BY Col1, Col2, Col3 )) + @BatchId - 1
FROM BatchTest
)
UPDATE bt
SET bt.BatchId = bi.BatchId
FROM BatchTest bt
INNER JOIN BatchedIds bi ON bi.ID = bt.ID
Затем вы можете запросить BatchTest и получить следующие результаты:
SELECT * FROM BatchTest
ORDER BY BatchId
ID Col1 Col2 Col3 BatchId
4 A B C 34
1 A B C 34
2 A B C 34
8 A B C 34
5 A B D 35
6 A B D 35
7 A B D 35
11 A B D 35
12 A B E 36
9 A B E 36
10 A B E 36
3 A B E 36