Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kolumna podobna do tożsamości, ale oparta na kryteriach Grupuj według

Zgadzam się z Seanem - dodaj kolumnę tożsamości, a następnie użyj kolumny obliczonej dla identyfikatora zadania. Mimo że odpowiedziałem na pytanie bardzo podobne do tego tutaj, nie jestem pewien, czy oznaczę to jako duplikat. Powodem tego jest to, że chcesz użyć task_id jako część klucza podstawowego.
Jednak nie jestem pewien, czy jest to możliwe, ponieważ aby dołączyć kolumnę obliczoną do klucza podstawowego, musi ona być persisted , iz jakiegoś powodu (myślę, że jest to spowodowane użyciem UDF) SQL Server nie pozwoli mi oznaczyć go jako utrwalonego.
W każdym razie, oto moje proponowane rozwiązanie:

Najpierw utwórz funkcję, która obliczy identyfikator zadania:

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 

Następnie utwórz tabelę z identyfikatorem zadania jako kolumną obliczeniową:

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

Teraz przetestuj:

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

SELECT *
FROM Tasks

Wyniki:

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

Możesz zobaczyć demo na żywo na rextesterze.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Powody, dla których warto uaktualnić do SQL Server 2017

  2. Najlepszy sposób na wdrożenie ścieżki audytu w SQL Server?

  3. Jak ustawić opcję maxrecursion dla CTE wewnątrz funkcji Table-Valued-Function?

  4. Bulk DELETE w SQL Server 2008 (Czy istnieje coś takiego jak Bulk Copy (bcp) do usuwania danych?)

  5. Jakie są przypadki użycia wyboru CHAR nad VARCHAR w SQL?