我不知道这个问题的适当标题是什么,但这是我需要完成的事情
这是我的数据集:
State TimeInState
--------------------------
1 20
3 0
4 5
8 2
5 10
1 18
3 30
12 2
2 0
我想要的是这里的另一栏,比方说FooID。 FooID是一个int值,在状态再次为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
因此,如果在State = 1的末尾有另一行,那么FooID将为3,直到下一个状态发生变化。
如何在T-SQL中完成此操作?
提前致谢。
答案 0 :(得分: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;
但如果您还没有以某种方式订购数据,那么我认为您无法确保结果集会按照您想要的方式对数据进行排序。