Мне неясно, что вы действительно хотите сделать, но вот что я думаю о
SELECT *, ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Id) % 4 UniqueNumber
FROM
(
VALUES
(1,'test1'),
(2,'test2'),
(3,'test3'),
(4,'test4'),
(5,'test1'),
(6,'test2'),
(7,'test3'),
(8,'test4')
) T(Id, Name)
ORDER BY Id
Возвращает:
+----+-------+--------------+
| Id | Name | UniqueNumber |
+----+-------+--------------+
| 1 | test1 | 1 |
| 2 | test2 | 1 |
| 3 | test3 | 1 |
| 4 | test4 | 1 |
| 5 | test1 | 2 |
| 6 | test2 | 2 |
| 7 | test3 | 2 |
| 8 | test4 | 2 |
+----+-------+--------------+
Или, может быть, лучше использовать SEQUENCE
как
CREATE SEQUENCE MySec
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 4
CYCLE;
CREATE TABLE T(
Id INT IDENTITY(1, 1),
Name VARCHAR(45),
UniqueNumber INT DEFAULT (NEXT VALUE FOR MySec)
);
INSERT T(Name)
VALUES
('test1'),
('test2'),
('test3'),
('test4'),
('test1'),
('test2'),
('test3'),
('test4');
SELECT * FROM T;
Лучший способ использования вычисляемого столбца как
CREATE TABLE TT(
Id INT IDENTITY(1, 1),
Name VARCHAR(45),
UniqueNumber AS (Id - (Id - 1) % 4)
);
INSERT TT(Name)
VALUES
('test1'),
('test2'),
('test3'),
('test4'),
('test1'),
('test2'),
('test3'),
('test4'),
('test1'),
('test2'),
('test3'),
('test4'),
('test1'),
('test2'),
('test3'),
('test4');
SELECT * FROM TT;