Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Coluna semelhante a identidade, mas com base nos critérios Agrupar por


Concordo com Sean - adicione uma coluna de identidade e, em seguida, use uma coluna computada para o ID da tarefa. Mesmo que eu tenha respondido a uma pergunta muito parecida com esta aqui, não tenho certeza de marcar esta como duplicada. A razão para isso é que você deseja usar o task_id como parte da chave primária.
No entanto, não tenho certeza de que isso seja possível, pois para incluir uma coluna computada na chave primária ela deve ser persisted , e por algum motivo (acho que é por causa do uso de uma UDF) o SQL Server não me permite marcá-lo como persistente.
De qualquer forma, aqui está minha solução proposta para isso:

Primeiro, crie uma função que calculará o ID da tarefa:
CREATE FUNCTION dbo.GenerateTaskId
(
    @Row_Id int,
    @Issue_Id int,
    @Issue_Sub_Id int
)
RETURNS Int
AS
BEGIN

    RETURN 
    (
        SELECT COUNT(*)
        FROM dbo.Tasks
        WHERE Issue_Id = @Issue_Id
        AND Issue_Sub_ID = @Issue_Sub_ID
        AND Row_Id <= @Row_Id
    )
END
GO 

Em seguida, crie a tabela com o ID da tarefa como uma coluna computada:
CREATE TABLE dbo.Tasks
(
    Row_Id [int] IDENTITY(1,1),
    Issue_ID [int] NOT NULL,
    Issue_Sub_ID [int] NOT NULL,
    Task_Id AS dbo.GenerateTaskId(Row_Id, Issue_Id, Issue_Sub_Id), 
    CONSTRAINT PK_Tasks PRIMARY KEY (Row_Id)
)
GO

Agora, teste:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)

SELECT *
FROM Tasks

Resultados:
Row_Id  Issue_ID    Issue_Sub_ID    Task_Id
1       12345       1               1
2       12345       1               2
3       12345       1               3
4       12345       2               1
5       12345       2               2
6       67890       2               1
7       67890       2               2
8       67890       2               3

Você pode ver uma demonstração ao vivo no rextester.