2014-06-16 4 views
0
Gid Rid Cid PriorityId 

1 7 11 NULL 
1 7 12 NULL 
1 8 13 NULL 
1 9 25 NULL 
1 13 18 NULL 
1 13 19 NULL 
1 14 23 NULL 
1 14 24 NULL 

Je dois définir priorityId comme suit. Quelqu'un peut-il suggérer une déclaration de mise à jour SQL. Je pense que je besoin d'un groupe par Rid et Gid ou auto rejoindresql Instruction de mise à jour selfjoin

Gid Rid Cid PriorityId 

1 7 11 1 
1 7 12 2 
1 8 13 1 
1 9 25 1 
1 13 18 1 
1 13 19 2 
1 14 23 1 
1 14 24 2 

Merci

+0

Qu'est-il arrivé lorsque vous avez tenté de groupe en débarrasser et gid, ou lorsque vous avez essayé de mettre à jour en se joignant à la table elle-même? N'avez-vous pas vu les résultats que vous attendiez? –

+2

quelle version de SQL? mySQL, SQL Server 2012, Oracle 11g? Cela semble pouvoir être manipulé par le concept de fenêtre impliqué dans l'utilisation de la syntaxe 'over' dans SQL Server ou Oracle. Quelque chose comme: http://stackoverflow.com/questions/14359749/how-to-return-a-incremental-group-number-per-group-in-sql – xQbert

+0

Est-ce que 'Cid' est important? Et quelle est la saveur de SQL que vous utilisez? – Siyual

Répondre

1

Pour SQL Server 2012, vous pouvez utiliser ce qui suit à l'aide d'une déclaration Over avec Gid et Rid comme partitions:

Update T 
Set  PriorityId = D.PriorityId 
From  
( 
    Select Gid, Rid, Cid, 
      Row_Number() Over (Partition By Gid, Rid Order By Gid, Rid, Cid) As PriorityId 
    From Table 
) D 
Join Table T On T.Gid = D.Gid 
        And T.Rid = D.Rid 
        And T.Cid = D.Cid 

la déclaration intérieure ci-dessous devrait vous montrer les résultats sans mettre à jour la table:

Select Gid, Rid, Cid, 
     Row_Number() Over (Partition By Gid, Rid Order By Gid, Rid, Cid) As PriorityId 
From Table 
+1

Merci pour votre hlep – user575219

+0

j'ai essayé u mise à jour ensemble u.priorityid = T1.RowFilter FROM Table1 u INNER JOIN (SELECT groupId, ruleid, DENSE_RANK() OVER (ORDER BY groupId, ruleid) AS RowFilter à partir de Table1 hl ORDER BY RowFilter) Comme T1 ON u.gid = T1.gid et u.rid = T1.rid. Je n'ai pas l'air de faire le classement. J'ai donc eu besoin de row_number au lieu de DRIVER_RANK. Et orderby ConnectionID – user575219

+0

+1. . . C'est une bonne réponse. Il existe cependant un moyen plus simple d'écrire la mise à jour. Vois ma réponse. –

1

Je voudrais écrire la mise à jour comme celui-ci:

with toupdate as (
    Select t.* 
      Row_Number() Over (Partition By Gid, Rid Order By Gid, Rid, Cid) As new_PriorityId 
    From Table t 
    ) 
update toupdate 
    set PriorityId = new_PriorityID;