SQL Server:根据条件

时间:2016-11-08 23:48:25

标签: sql sql-server tsql

我不知道这个问题的适当标题是什么,但这是我需要完成的事情

这是我的数据集:

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

因此,如果在State = 1的末尾有另一行,那么FooID将为3,直到下一个状态发生变化。

如何在T-SQL中完成此操作?

提前致谢。

1 个答案:

答案 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;

但如果您还没有以某种方式订购数据,那么我认为您无法确保结果集会按照您想要的方式对数据进行排序。