sql >> データベース >  >> RDS >> Sqlserver

Identityのような列ですが、GroupBy基準に基づいています

    ショーンに同意します-ID列を追加してから、タスクIDに計算列を使用します。ここでこのような質問に非常によく答えましたが、これを重複としてマークするかどうかはわかりません。これは、task_idを使用するためです。 主キーの一部として。
    ただし、主キーに計算列を含めるには、persistedする必要があるため、それが可能かどうかはわかりません。 、および何らかの理由で(UDFを使用しているためだと思います)SQL Serverでは、永続化としてマークを付けることができません。
    とにかく、これに対して提案されたソリューションは次のとおりです。

    まず、タスクIDを計算する関数を作成します:

    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 
    

    次に、タスクIDを計算列として使用してテーブルを作成します。

    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
    

    今、それをテストします:

    INSERT INTO Tasks VALUES
    (12345, 1),
    (12345, 1),
    (12345, 1),
    (12345, 2),
    (12345, 2),
    (67890, 2),
    (67890, 2),
    (67890, 2)
    
    SELECT *
    FROM Tasks
    

    結果:

    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
    

    rextesterでライブデモを見ることができます。




    1. WHERE句にVaryingINリストがあるテーブルからSELECT

    2. T-SQLサブクエリMax(Date)と結合

    3. 古いサーバーから新しいサーバーにすべてのMySQLデータベースを転送する方法

    4. PHPでPostgreSQLに接続できないpg_connect()