我正在尝试编写一个查询,该查询返回所有后续日期旁边的最后一个非空值,直到遇到新的非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
我一直试图寻找答案,但我没有想出任何答案。如果这种问题很常见,请原谅我。感谢
答案 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
答案 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
这根本不是通用的。