2012-03-02 3 views
0

Есть ли простой запрос заполнить пробелы в столбце со следующим непустым значением в этом столбце? Я хочу, чтобы столбец, который имеет такие данные:Заполнение столбцов нулями со следующим ненулевым значением

-------------------- 
| ID | Version  | 
-------------------- 
| 1 | '162.39' | 
-------------------- 
| 2 | NULL  | 
-------------------- 
| 3 | NULL  | 
-------------------- 
| 4 | '162.40' | 
-------------------- 
| 5 | '162.41' | 
-------------------- 
| 6 | NULL  | 
-------------------- 
| 7 | NULL  | 
-------------------- 
| 8 | '162.42' | 
-------------------- 
| 9 | '162.42' | 
-------------------- 
| 10 | NULL  | 
-------------------- 

Чтобы закончить, как этот

-------------------- 
| ID | Version  | 
-------------------- 
| 1 | '162.39' | 
-------------------- 
| 2 | '162.40' | 
-------------------- 
| 3 | '162.40' | 
-------------------- 
| 4 | '162.40' | 
-------------------- 
| 5 | '162.41' | 
-------------------- 
| 6 | '162.42' | 
-------------------- 
| 7 | '162.42' | 
-------------------- 
| 8 | '162.42' | 
-------------------- 
| 9 | '162.42' | 
-------------------- 
| 10 | NULL  | 
-------------------- 

Последнее значение (s) может быть либо '162.42' или остаться на NULL.

+0

Is ID автоинкремент? – sll

+0

@sll Я не вижу, какая разница, идентификаторы не обновляются? – robertc

+1

Я прошу только быть уверенным, может ли моя идея быть реализована, она полагается на то, что каждая следующая запись имеет идентификатор больше, чем предыдущий – sll

ответ

3

Попробуйте это:

UPDATE table t1 
SET Version = (
       SELECT TOP 1 Version 
       FROM table t2 
       WHERE t2.id > t1.id 
        AND Version IS NOT NULL 
       ORDER BY t2.ID ASC 
      ) 
WHERE t1.Version IS NULL 

Я не пробовал, возможно, вам придется исправить некоторые детали.

+1

Мне пришлось сделать 'ORDER BY t2.ID ASC', чтобы он работал – robertc

1

Да, вы можете использовать запрос, содержащий коррелированный подзапрос, который вернет первое значение идентификаторов под ним. Что-то вроде следующего: (остерегайтесь код только из памяти)

SELECT T1.Id, (SELECT TOP 1 Version FROM MyTable T2 WHERE T2.Id > T1.Id AND Version IS NOT NULL ORDER BY T2.Id ASC) 
FROM MyTable T1 
WHERE T1.Version IS NULL 

Вы можете использовать этот запрос для питания оператор обновления для обновления таблицы.

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