Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Colonna simile all'identità ma basata su criteri Raggruppa per

Sono d'accordo con Sean:aggiungi una colonna di identità, quindi usa semplicemente una colonna calcolata per l'ID attività. Anche se ho risposto a una domanda molto simile a questa qui, non sono sicuro di contrassegnarla come duplicata. Il motivo è che vuoi usare task_id come parte della chiave primaria.
Tuttavia, non sono sicuro che sia possibile, poiché per includere una colonna calcolata nella chiave primaria deve essere persisted , e per qualche motivo (penso sia dovuto all'uso di un UDF) SQL Server non mi consentirà di contrassegnarlo come persistente.
Comunque, ecco la mia soluzione proposta per questo:

Innanzitutto, crea una funzione che calcolerà l'ID attività:

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 

Quindi, crea la tabella con l'ID attività come colonna calcolata:

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

Ora, provalo:

INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)

SELECT *
FROM Tasks

Risultati:

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

Puoi vedere una demo dal vivo su rextester.