SQL查询按日期运行当前值

时间:2015-04-06 16:37:32

标签: sql sql-server

我正在尝试编写一个查询,该查询返回所有后续日期旁边的最后一个非空值,直到遇到新的非null值。输入表看起来像这样:

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

我一直试图寻找答案,但我没有想出任何答案。如果这种问题很常见,请原谅我。感谢

3 个答案:

答案 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 :(得分:1)

另一种方式,如果日期字段为unique,并且increasing by one with 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

答案 2 :(得分:1)

如果数据中的Null Rows一次最多只有一行,您可以在COALESCE中使用LAG重复上一行的值:

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

这根本不是通用的。