Бих използвал изчислена колона за PhraseVersion
, което ще отнеме броя на редовете със същия PhraseID
и Id
по-нисък или равен на текущия ред.
За да направите това, трябва да създадете UDF, за да изчислите PhraseVersion:
CREATE FUNCTION dbo.GetPhraseVersion (
@PhraseId int,
@id int
)
RETURNS INT
AS
BEGIN
RETURN (
SELECT COUNT(*)
FROM T
WHERE PhraseId = @PhraseId
AND Id <= @id
)
END
GO
След това създайте таблицата с изчислената колона:
CREATE TABLE T
(
id int identity(1,1),
PhraseId int,
PhraseVersion as dbo.GetPhraseVersion(PhraseId, id)
)
GO
Сега за теста - вмъкнете 4 записа:
INSERT INTO T (PhraseId) VALUES(1),(1),(1),(2)
Изберете:
SELECT *
FROM T
Резултати:
id PhraseId PhraseVersion
1 1 1
2 1 2
3 1 3
4 2 1
Можете да видите демонстрация на живо на rextester.