2016-11-08 2 views
1

я не знаю, что будет подходящее название для этой проблемы, но вот то, что мне нужно выполнитьSQL Server: установить значение строки на основе условия

Вот мой набор данных:

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 

Так что, если есть еще одна строка в конце с государством = 1, то FooID будет 3 до следующего состояния не изменяется.

Как это сделать в T-SQL?

Заранее спасибо.

+4

Ну, для начала вам, вероятно, потребуется что-то заказать (дата/время или идентификатор или что-то еще). Что нет в ваших текущих данных образца. – ZLK

ответ

2

Если у вас есть какой-то способ упорядочения строк (как идентификатор рода), то вот пример того, как вы могли бы сделать что-то вроде этого:

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; 

Но если у вас нет данные упорядочены в некотором роде, тогда я не думаю, что вы можете гарантировать, что результирующий набор будет сортировать данные так, как вы хотите их отсортировать.

Смежные вопросы