SQL从日期范围生成每日记录

时间:2015-04-30 14:01:36

标签: sql sql-server tsql

我有下一个情况(SQL SERVER 2012):

这是我的源表(日期是dd-mm-yyyy):

id|startDate   |updateDate  |percentage
--|------------|------------|----------
01|  01-01-2015|  03-01-2015|  45
01|  01-01-2015|  05-01-2015|  80
01|  01-01-2015|  06-01-2015|  100

我想最终得到以下表格:

id|date        |percentage
--|------------|----------
01|  01-01-2015|  0
01|  02-01-2015|  0
01|  03-01-2015|  45
01|  04-01-2015|  45
01|  05-01-2015|  80
01|  06-01-2015|  100

我的计划是使用日期表进行连接,但我主要关注的是如何生成百分比为0的记录,因为源只有一个startdate和第一个更新。

所以我看到它,首先我需要在startDate和第一个updateDate之间做一个日期,从当前updateDate和之前的updateDate之间有一个日期。这就是我担心的问题,我怎样才能做到这一点?

提前感谢!

PS。日期表只是一个包含每个日期的简单表格

id|date        |month |etc...
--|------------|------|-------
01|  01-01-2015|  1   |
01|  02-01-2015|  1   |
01|  03-01-2015|  1   |
01|  04-01-2015|  1   |
01|  05-01-2015|  1   |
01|  06-01-2015|  1   |
etc...

2 个答案:

答案 0 :(得分:1)

一种方法(使用递归CTE):

; with cte as
(select '01' id, cast('2015-01-01' as datetime) [date], 0 percentage
 union all
 select c.id, 
        dateadd(DAY,1,c.[date]) [date], 
        coalesce((select s.percentage
                  from SourceTable s 
                  where c.id = s.id and dateadd(DAY,1,c.[date]) = s.updatedate), 
                 c.percentage) percentage
 from cte c
 where c.[date] < '2015-01-06')
select * from cte

SQLFiddle here

答案 1 :(得分:0)

首先将您的日期帮助表与updateDate上的源表联系起来。 然后,我将子查询关联起来,以获得任何小于我们当前加入日期的日期的最大百分比。

With tblDates AS (
        select *
        from Dates d
        left join Table1 t on CAST(d.date as date) = t.updateDate
        )
    select  d.id, 
            d.[date],
            (select ISNULL(max(percentage), 0)
            from tblDates d1
            where d1.[date] < d.[date]) as percentage
    from tblDates d