2014-03-12 71 views
2

我有一列零和一個保留順序,其中零表示數據片段之間的中斷。 下面是示例Row_number()取決於條件

A Ord 
1 1 
1 2 
0 3 
0 4 
0 5 
1 6 
1 7 
1 8 
0 9 
1 10 

我想獲得的是相同的列,其中後零(或零)增加的所有元素由1相比,非零元素的先前包。因此,變換後的上述示例必須如下所示:

A Ord 
1 1 
1 2 
0 3 
0 4 
0 5 
2 6 
2 7 
2 8 
0 9 
3 10 

每組中的零和1的數量可以是任意的。 我試圖用row_number()和join的不同組合來做,但最終失敗了。

+0

你所說的 「爲了保存」 的意思。你有另外一個列來定義行的順序嗎?你使用什麼版本的SQL Server? –

+0

也許compine滯後/鉛與cummltive總和 – haki

+0

Mikael,是的,我編輯的例子,所以它應該現在更清楚。我使用2008版的 – niydiyin

回答

3

如果您使用SQL Server 2012,則可以使用lag()sum() over()

select iif(T.A = 0, 0, sum(T.C) over(order by T.Ord rows unbounded preceding)) as A, 
     T.Ord 
from (
    select Y.A, 
      Y.Ord, 
      iif(Y.A = 1 and isnull(lag(Y.A) over(order by Y.Ord), 0) = 0, 1, 0) as C 
    from YourTable as Y 
    ) as T 

SQL Fiddle

+0

它的工作原理非常完美。謝謝!我會仔細考慮你的答案,並嘗試在2008年使用它 – niydiyin