Вы можете использовать CTE, как это ...
;
WITH cteDups
AS (SELECT SERIAL_NO ,
RN = ROW_NUMBER() OVER
(PARTITION BY SERIAL_NO ORDER BY SERIAL_NO)
FROM HISTORY_INCIDENTS
)
SELECT CASE RN
WHEN 2 THEN SERIAL_NO + '-1'
ELSE SERIAL_NO
END AS SERIAL_NO
FROM cteDups
fiddle см. Это создаст номер строки , когда есть дубликат, то вы можете использовать CASE
, чтобы проверить наличие -й лет, и назначить -1 к этой записи.
EDIT: на основе комментариев
DECLARE @HISTORY_INCIDENTS TABLE (SERIAL_NO INT);
DECLARE @NewHISTORY_INCIDENTS TABLE (SERIAL_NO VARCHAR(10));
INSERT INTO @HISTORY_INCIDENTS
(SERIAL_NO)
VALUES (1);
INSERT INTO @HISTORY_INCIDENTS
(SERIAL_NO)
VALUES (2);
INSERT INTO @HISTORY_INCIDENTS
(SERIAL_NO)
VALUES (2);
INSERT INTO @HISTORY_INCIDENTS
(SERIAL_NO)
VALUES (2);
;
WITH cteDups
AS (SELECT SERIAL_NO ,
RN = ROW_NUMBER() OVER (PARTITION BY SERIAL_NO
ORDER BY SERIAL_NO)
FROM @HISTORY_INCIDENTS
)
INSERT INTO @NewHISTORY_INCIDENTS
(SERIAL_NO
)
SELECT CASE RN
WHEN 2 THEN CAST(SERIAL_NO AS VARCHAR(10)) + '-1'
ELSE CAST(SERIAL_NO AS VARCHAR(10))
END AS SERIAL_NO
FROM cteDups
SELECT SERIAL_NO
FROM @NewHISTORY_INCIDENTS
является текстовым полем 'SERIAL_NO' (char, varchar, ...)? – Barranka
Вы только когда-либо имеете ** 1 дубликат **? – christiandev
Serial_no - это int. Да, существует не более 1 дубликата –