如何填写分区数据中缺少的日期和值?

时间:2014-05-20 02:59:45

标签: sql sql-server-2008 tsql date

如何填写分区数据中缺少的日期和值?

我遇到了很多麻烦谷歌搜索这个,因为大多数帖子似乎都是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

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;