2017-09-02 3 views
0

Comment puis-je ajouter un numéro d'identité de sorte que lorsqu'une ligne est insérée, un numéro incrémentiel est affecté comme ci-dessous par un déclencheur? J'utilise SQL Server.SQL Server: Colonne d'identité par groupe

1 AAA 
2 AAA 
3 BBB 
4 CCC 
5 CCC 
6 CCC 
7 DDD 
8 DDD 
9 EEE 
.... 

Et je veux le convertir en:

1 AAA 1 
2 AAA 2 
4 CCC 1 
5 CCC 2 
6 CCC 3 
7 DDD 1 
8 DDD 2 
+0

quelle base de données utilisez-vous? – Dalorzo

+0

Base de données MS SQL – Mansoor

+0

Voulez-vous également filtrer les lignes avec les ID 3 et 9? – cars10m

Répondre

0

Vous pouvez créer un FUNCTION qui obtenir un nom et donne l'identité MAX pour le paramètre donné:

CREATE FUNCTION [dbo].[GetIdentityForName] (@Name VARCHAR(MAX)) 
RETURNS INT 
AS 
    BEGIN 
     RETURN 
     (SELECT ISNULL(MAX(NameId),0)+1 
     FROM YourTable 
     WHERE Name = @Name); 
    END 

puis mis DefaultValue pour NameId pour appeler la fonction lorsqu'un enregistrement a été inséré comme ceci:

ALTER TABLE YourTable ADD CONSTRAINT 
    DF_Identity_NameId DEFAULT ([dbo].[GetIdentityForName](Name)) FOR NameId 

En supposant que YourTable est (Id, Name, NameId).

J'espère être utile pour vous :)

+0

Votre bienvenue. donc vous le marquez accepté :) –

+0

est-il possible d'obtenir la réponse dans le même tableau? – Mansoor

+0

Vous voulez obtenir les résultats en tant que 'Query' sans changer la définition de la table? –

1

Il n'y a aucune raison pour laquelle vous devez stocker la valeur. Vous pouvez le calculer lorsque vous en avez besoin:

select t.*, row_number() over (partition by name order by id) as nameId 
from t;