为缺少的数据添加一行

时间:2017-07-04 16:03:13

标签: sql sql-server tsql

在日期范围2017-02-01 - 2017-02-10之间,我正在计算运行余额。 我有几天我们缺少数据,如何将这些缺失的日期包含在前几天的余额中?

示例数据:

enter image description here

我们缺少2017-02-04,2017-02-05和2017-02-06的数据,如何在查询中添加前一个余额的行? 日期范围是一个参数,因此可能会改变....

我可以使用滞后功能吗?

3 个答案:

答案 0 :(得分: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;

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

继续加入你的桌子并获得总计

答案 2 :(得分:0)

添加到日期范围&amp; CTE解决方案,我在许多数据库中创建了Date Dimension表,我刚刚加入它们。

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