2015-08-31 3 views
0

У меня есть эта таблица SQLSQL: Нет данных для одной даты, в комплекте со следующим

date value 
2014-01-02 00:00:00.000 524,61 
2014-01-03 00:00:00.000 529,55 
2014-01-04 00:00:00.000 NULL 
2014-01-05 00:00:00.000 NULL 
2014-01-06 00:00:00.000 528,80 
2014-01-07 00:00:00.000 531,14 
2014-01-08 00:00:00.000 531,65 
2014-01-09 00:00:00.000 532,14 
2014-01-10 00:00:00.000 533,97 
2014-01-11 00:00:00.000 NULL 

Мне нужно завершить все NULL значения со следующим не-нулевым значением.

благодаря

+0

Определить «следующее значение». Значение на следующую дату? –

+3

Какая ваша СУБД (SQL Server, MySQL и т. Д.)? –

+0

И, пожалуйста, добавьте некоторую информацию о своей модели данных (запрос, таблицы ...) –

ответ

2

Вот SELECT, который делает то, что вы хотите:

select t.date, t2.value 
from table t outer apply 
    (select top 1 t2.* 
     from table t2 
     where t2.date <= t.date and t2.value is not null 
     order by t2.date desc 
    ) t2; 

Это также может быть сформулирован как update, если вы действительно хотите установить значения в данных.

+0

этот запрос возвращает '524.61' как значение для всех строк – SmartDev

+0

@SmartDev. , , Да, порядок в «cross apply» должен быть в правильном направлении, поэтому первое значение не всегда возвращается, –

0

ОБРАЗЕЦ ДАТА:

declare @tbl table (Date INT, val INT) 
insert into @tbl values(1,524), (2,529), (3,NULL), (4,NULL), (5,531) 

QUERY

select Date, 
     coalesce(val,(select top 1 val 
        from @tbl t2 
        where val is not null and t1.Date < t2.Date 
        ) 
       ) Col_Without_NULLS 
from @tbl t1 
0

Спасибо всем код был хорошо, но> был в противоположном направлении

select t.date, t2.value 
from #test t outer apply 
    (select top 1 t2.* 
     from #test t2 
     where t.date <= t2.date and 
     t2.value is not null 
     order by t2.date 
    ) t2; 
0

Т его следует использовать:

select 
    M.date, isnull(M.value, min(S.value)) as value 
from 
    @data M 
    left outer join @data S on M.date < S.date and S.value is not null 
group by 
    M.date, M.value 
order 
    by M.date