sql >> Base de Datos >  >> RDS >> Sqlserver

Columna similar a la identidad pero basada en criterios de Agrupar por

Estoy de acuerdo con Sean:agregue una columna de identidad y luego use una columna calculada para la identificación de la tarea. Aunque he respondido una pregunta muy parecida a esta aquí, no estoy seguro de marcar esta como un duplicado. El motivo de esto es que desea utilizar el task_id como parte de la clave principal.
Sin embargo, no estoy seguro de que eso sea posible, ya que para incluir una columna calculada en la clave principal debe ser persisted , y por alguna razón (creo que es por el uso de un UDF) SQL Server no me permitirá marcarlo como persistente.
De todos modos, aquí está mi solución propuesta para esto:

Primero, crea una función que calculará la identificación de la tarea:

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 

Luego, cree la tabla con la identificación de la tarea como una columna calculada:

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

Ahora, pruébalo:

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

Puede ver una demostración en vivo en rextester.