如何填写分区数据中缺少的日期和值?
我遇到了很多麻烦谷歌搜索这个,因为大多数帖子似乎都是Oracle数据库,我正在使用Microsoft SQL Server。
我有以下假设表:
name date val
-------------------------------
A 01/01/2014 1.5
A 01/03/2014 2
A 01/06/2014 5
B 01/02/2014 90
B 01/07/2014 10
我想填补空白之间的日期,并复制最近一个日期的值。另外,我想填写日期1)回到预先设定的MINDATE(让我们说它是12/29/2013)和2)上升到当前日期(让我们说它是2014年9月1日) - 和2)默认值为1。
因此,输出将是:
name date val
-------------------------------
A 12/29/2014 1.5
A 12/30/2014 1.5
A 12/31/2014 1.5
A 01/01/2014 1.5 <- original
A 01/02/2014 2
A 01/03/2014 2 <- original
A 01/04/2014 5
A 01/05/2014 5
A 01/06/2014 5 <- original
A 01/07/2014 1
A 01/08/2014 1
A 01/09/2014 1
B 12/29/2014 90
B 12/30/2014 90
B 12/31/2014 90
B 01/01/2014 90
B 01/02/2014 90 <- original
B 01/03/2014 10
B 01/04/2014 10
B 01/05/2014 10
B 01/06/2014 10
B 01/07/2014 10 <- original
B 01/08/2014 1
B 01/09/2014 1
答案 0 :(得分:2)
首先,您需要生成日期。然后,您可以生成日期和名称的所有组合。最后,填写值。以下是使用cross apply
:
with dates as (
select @MINDATE as thedate
union all
select dateadd(day, 1, thedate)
from dates
where dateadd(day, 1, thedate) <= getdate()
)
select thedate, vals.val
from dates cross join
(select distinct name from hypothetical) h cross apply
(select top 1 val
from hypothetical h2
where h2.name = h.name and h2.date <= dates.thedate
order by date desc
) vals;