2014-09-19 32 views
0

我實際上是SQL Server 2008的新手,我嘗試對錶中的數字進行排序和重新設置。來源是這樣的:在SQL Server 2008中排序和重新設置

Row Refrec FLAG 
1  5  NULL 
2  4  X  
3  3  NULL 
4  2  NULL 
5  1  Y  
6  5  A  
7  4  B   
8  3  NULL 
9  2  NULL 
10 1  NULL 

結果應該是這樣的:

Row Refrec FLAG SEQUENCE 
1  5  NULL NULL 
2  4  X  0 
3  3  NULL 1 
4  2  NULL 2 
5  1  Y  0 
6  5  A  0 
7  4  B  0  
8  3  NULL 1 
9  2  NULL 2 
10 1  NULL 3 

謝謝!

+1

請解釋用於生成'SEQUENCE'列的邏輯。 – 2014-09-19 10:57:41

回答

2

看起來您想要枚舉NULL值的序列值,並將所有其他值設置爲0。我不確定爲什麼第一個值是NULL,但這很容易修復。

下可以做你想做的:

select t.*, 
     (case when flag is not null then 0 
      else row_number() over (partition by seqnum - row order by row) 
     end) as Sequence 
from (select t.*, row_number() over (partition by flag order by row) as seqnum 
     from table t 
    ); 

如果你真正關心的第一個值:

select t.*, 
     (case when row = 1 then NULL 
      when flag is not null then 0 
      else row_number() over (partition by seqnum - row order by row) 
     end) as Sequence 
from (select t.*, row_number() over (partition by flag order by row) as seqnum 
     from table t 
    ); 
+0

+1雖然我認爲外部查詢中的row_number應該有一個從它中扣除,這也意味着'標誌不爲空然後0'的情況下'檢查是多餘的,因爲這些將始終是第一行。 [SQL小提琴示例](http://sqlfiddle.com/#!3/a28b6/1) – GarethD 2014-09-19 11:12:19