2014-06-16 44 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 

我需要將priorityId設置爲以下內容。任何人都可以提出一個SQL更新聲明。 我想我會需要一組由擺脫和GID或自加入sql更新語句自加入

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 

謝謝

+0

當你試圖按擺脫和gid發生了什麼事,或者當你試圖通過加入將表與自身進行更新?你沒有看到你預期的結果嗎? –

+2

什麼版本的SQL? mySQL,SQL Server 2012,Oracle 11g?這看起來好像可以通過在SQL Server或Oracle中使用'over'語法涉及的窗口概念來處理它。像這樣:http://stackoverflow.com/questions/14359749/how-to-return-a-incremental-group-number-per-group-in-sql – xQbert

+0

'Cid'重要嗎?你用什麼SQL的味道? – Siyual

回答

1

對於SQL Server 2012,您可以使用使用Over語句GidRidpartitions如下:

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 

下內聲明你應該顯示結果而不更新表:

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

感謝您的HLEP – user575219

+0

我試圖更新ü 集u.priorityid = T1.RowFilter FROM表1ü 內加入 (SELECT GROUPID,ruleid, DENSE_RANK()OVER(ORDER BY GROUPID,ruleid) AS RowFilter FROM Table1 hl ORDER BY RowFilter )As T1 ON u.gid = T1.gid and u.rid = T1.rid。似乎沒有排名。所以我需要row_number而不是dense_rank。並通過ConnectionID – user575219

+0

+1。 。 。這是一個很好的答案。但是,有一種更簡單的方法來編寫更新。看到我的答案。 –

1

我會寫這樣的更新:

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;