2016-11-08 52 views
1

我不知道會是什麼這個問題的合適的標題,但在這裏行值是什麼,我需要完成SQL服務器:設置基於一個條件

這裏是我的數據集:

State   TimeInState 
-------------------------- 
    1     20 
    3     0 
    4     5 
    8     2 
    5     10 
    1     18 
    3     30 
    12     2 
    2     0 

我想要的是這裏的另一列,可以說FooID。什麼FooID是一個i​​nt值,它將保持相同,直到狀態再次爲1。

因此,該數據集是這樣的:

State   TimeInState   FooID 
------------------------------------------ 
    1     20    1 
    3     0    1 
    4     5    1 
    8     2    1 
    5     10    1 
    1     18    2 
    3     30    2 
    12     2    2 
    2     0    2 

所以如果有另一行與在國家結束= 1,那麼FooID將是3,直到下一個狀態改變。

我該如何在T-SQL中完成這項工作?

在此先感謝。

+4

那麼,首先,您可能需要一些東西來訂購(日期/時間或ID或某物)。您目前的樣本數據中不存在這一點。 – ZLK

回答

2

如果你有訂購行(像各種各樣的ID)的一些方法,那麼這裏就是你怎麼會做這樣的事情的例子:

DECLARE @T TABLE (ID INT IDENTITY(1, 1), State INT, TimeInState INT) 
INSERT @T (State, TimeInState) 
VALUES (1, 20), (3, 0), (4, 5), (8, 2), (5, 10), (1, 18) 
    , (3, 30), (12, 2), (2, 0), (1, 1), (1, 1), (2, 1); 

WITH CTE AS (
    SELECT * 
     , ROW_NUMBER() OVER (ORDER BY CASE WHEN State = 1 THEN 0 ELSE 1 END, ID) RN 
    FROM @T 
    ) 
SELECT State, TimeInState, Foo.FooID 
FROM CTE T 
CROSS APPLY (SELECT MAX(RN) FooID FROM CTE WHERE State = 1 AND ID <= T.ID) Foo 
ORDER BY ID; 

但是,如果你沒有已經以某種方式排序的數據,那麼我認爲您不能確保結果集按照您想要排序的方式對數據進行排序。