2017-07-04 78 views
0

在日期范围内2017-02-01 - 2017-02-10,我正在计算运行余额。 我有我们缺少数据的日子,如何将这些缺失的日期与前几天的余额一起包括在内?为缺失数据添加一行

示例数据:

enter image description here

我们缺少了2017-02-04,2017-02-05和2017年2月6日的数据,我怎么会在查询中添加一行与以前的余额? 日期范围是一个参数,所以可以更改....

我可以使用类似滞后函数的东西吗?

回答

1

我会倾向于使用递归CTE,然后填写值。下面是使用outer apply一种方法:

with dates as (
     select mind as dte, mind, maxd 
     from (select min(date) as mind, max(date) as maxd from t) t 
     union all 
     select dateadd(day, 1, dte), mind, maxd 
     from dates 
     where dte < maxd 
    ) 
select d.dte, t.balance 
from dates d outer apply 
    (select top 1 t.* 
     from t 
     where t.date <= d.dte 
     order by t.date desc 
    ) t; 
0

您可以通过如下理货表生成日期:

Declare @d1 date ='2017-02-01' 
Declare @d2 date ='2017-02-10' 

;with cte_dates as (
    Select top (datediff(D, @d1, @d2)+1) Dates = Dateadd(day, Row_Number() over (order by (Select NULL))-1, @d1) from 
     master..spt_values s1, master..spt_values s2 
) 
Select * from cte_dates left join .... 

,做左加入到你的餐桌,并获得运行总计

0

添加到日期范围& CTE的解决方案,我已经在我刚刚离开加入到他们众多数据库创建日期维度表。

有免费的脚本在线为SQL Server创建日期维表。我强烈推荐他们。此外,它可以使其他时间段的聚合效率更高(例如季度,月份,年份等)。