2015-04-06 6 views
1

Я пытаюсь написать запрос, который возвращает последнее ненулевое значение рядом со всеми последующими датами, пока новое ненулевым значением является encountered.The входной таблицы будет выглядеть примерно так:SQL-запрос работает текущее значение по дате

DATE   VALUE 
==========  ====== 
01/01/2015  1 
02/01/2015  NULL 
03/01/2015  NULL 
04/01/2015  2 
05/01/2015  NULL 

И я хотел бы результирующая таблица запроса будет выглядеть следующим образом:

DATE   CURRENT VALUE 
==========  ============= 
01/01/2015  1 
02/01/2015  1 
03/01/2015  1 
04/01/2015  2 
05/01/2015  2 

Я попробовал искать вокруг для ответа, но я не придумал ничего. Простите меня, если такой вопрос распространен. Благодаря

+0

ли пробелы/пропущенные дни в ваших данных? Если это так, то вы, вероятно, захотите предварительно построить таблицу дат и использовать ее для внешнего применения. –

ответ

3

Возможно, самым простым способом является использование outer apply:

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

Если вы знаете, что значения увеличиваются, то в SQL Server 2012+ можно использовать max():

select date, max(value) over (order by date) as current_value 
from table t; 
1

Другой способ, если поле даты unique, и является increasing by onewith no gap, то вы можете использовать recursive cte:

with cte (dt,value) as 
(
select top 1 date , value from tbl where value is not null 
union all 
select t.date, isnull(t.value,cte.value) 
from tbl t 
join cte on t.date=dateadd(month,1,cte.dt) 
) 
select * from cte 

the FIDDLE DEMO

1

Если Null Строки в данных были не более одной строки в то время, вы могли бы использовать LAG в COALESCE повторить значение предыдущей строки в:

SELECT t1.Date, COALESCE(t1.Value, LAG (Value, 1) OVER (ORDER BY t1.Date ASC)) 
FROM Table1 t1 
ORDER By T1.Date ASC; 

К сожалению из Конечно, данные имеют пробелы в двух или более строк, что означает, что вы должны продолжать продлить COALESCING, что приводит к чему-то совершенно жуткой:

SELECT t1.Date, 
     COALESCE(t1.Value, 
       LAG (Value, 1) OVER (ORDER BY t1.Date ASC), 
       LAG (Value, 2) OVER (ORDER BY t1.Date ASC), 
       ...) 
FROM Table1 t1 
ORDER By T1.Date ASC 

Который не общий на всех.

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