sql >> Databáze >  >> RDS >> Sqlserver

Sloupec podobný identitě, ale založený na kritériích Seskupit podle

Souhlasím se Seanem – přidejte sloupec identity a pak použijte vypočítaný sloupec pro id úkolu. I když jsem zde odpověděl na otázku velmi podobnou této, nejsem si jistý, zda ji označit jako duplikát. Důvodem je, že chcete použít task_id jako součást primárního klíče.
Nejsem si však jistý, že je to možné, protože pro zahrnutí vypočítaného sloupce do primárního klíče musí být persisted a z nějakého důvodu (myslím, že je to kvůli použití UDF) mi SQL Server nedovolí označit to jako trvalé.
Každopádně zde je mé navrhované řešení:

Nejprve vytvořte funkci, která bude vypočítat ID úlohy:

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 

Poté vytvořte tabulku s ID úlohy jako vypočítaný sloupec:

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

Nyní to otestujte:

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

SELECT *
FROM Tasks

Výsledky:

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

Živé demo můžete vidět na rextesteru.




  1. 115 hlavních otázek na pohovor SQL, které si musíte připravit v roce 2022

  2. Funkce pro získání počtu dnů v týdnu mezi dvěma daty kromě svátků

  3. SQL Server Internals:Problematic Operators Pt. III – Druhy

  4. Cena za nečištění