TSQL插入缺少的日期和增量

时间:2013-01-31 04:39:00

标签: sql-server tsql sql-server-2008-r2

在SQL Server 2008 R2中,我有一个表(StatDays),其中包含订单处于特定状态的天数(DaysInStatus)。订单保留在该状态的每一天都有一个条目,除了星期日没有进程写入此表。在这种情况下,订单将在星期一再次出现,DaysInStatus提前两天。

我的问题是如何填充缺少的星期日值。 (我假设如果订单有周六入场但没有星期一入场,则该周六是最后一个所需的数据点。)

示例:

OrderID StatDate    DaysInStatus
A11111  6/1/2012    20
A11111  6/2/2012    21
A11111  6/4/2012    23
A11111  6/5/2012    24
A11111  6/6/2012    25
A11111  6/7/2012    26
A11111  6/8/2012    27
A11111  6/9/2012    28
A11111  6/11/2012   30

在这里,我希望将所有这些值插入(或选择)到另一个表中,加上缺少的日期6/3和6/10 - 其中DaysInStatus分别提前到22和29 - 以及OrderID。

此外,订单ID并不总是出现在此表中的DaysInStatus = 1.In几乎可以出现任何值,并且几乎可以退出任何值。

我已经尝试生成日期表,然后在statDate和StatDate + 1,StatDate-1上对StatDays进行左外连接。这适用于小型记录集,但实际表有超过1亿条记录,所以这对我不起作用。

提前感谢任何建议!

2 个答案:

答案 0 :(得分:1)

这是你的陈述

INSERT Status
SELECT s1.OrderID
      ,DATEADD(day,1,s1.StatDate)
      ,s1.DaysInStatus+1
FROM Status s1
     INNER JOIN
     Status s2 ON DATEADD(day,2,s1.StatDate)=s2.StatDate
                  AND
                  s1.DaysInStatus+2=s2.DaysInStatus
     LEFT JOIN
     Status s3 ON DATEADD(day,1,s1.StatDate)=s3.StatDate
                  AND
                  s1.DaysInStatus+1=s3.DaysInStatus
WHERE DATENAME(dw,s1.StatDate)='Saturday'
      AND
      s3.OrderID IS NULL

您可以看到SQLFiddle here

答案 1 :(得分:0)

试试这个。这将有助于任何失踪的日子。

create table StatDays(OrderID varchar(20),StatDate datetime,
                      DaysInStatus int)   

insert into statdays values('A11111',  '6/1/2012',    20)
insert into statdays values('A11111',  '6/2/2012',    21)
insert into statdays values('A11111',  '6/4/2012',    23)
insert into statdays values('A11111',  '6/5/2012',    24)
insert into statdays values('A11111',  '6/6/2012',    25)
insert into statdays values('A11111',  '6/7/2012',    26)
insert into statdays values('A11111',  '6/8/2012',    27)
insert into statdays values('A11111',  '6/9/2012',    28)
insert into statdays values('A11111',  '6/11/2012',   30)
insert into statdays values('A11112',  '6/1/2012',    20)
insert into statdays values('A11112',  '6/2/2012',    21)
insert into statdays values('A11112',  '6/4/2012',    23)
insert into statdays values('A11113',  '6/5/2012',    24)
insert into statdays values('A11113',  '6/6/2012',    25)
insert into statdays values('A11113',  '6/7/2012',    26)
insert into statdays values('A11113',  '6/8/2012',    27)
insert into statdays values('A11113',  '6/9/2012',    28)
insert into statdays values('A11113',  '6/13/2012',   32)







with 
demo_cte as 
(select orderid, min(statdate) Min_Date,max(statdate) Max_Date,
 min(DaysInStatus) Min_Day from StatDays group by orderid

 union all


 select orderid,DateAdd(day,1,Min_Date), Max_date,Min_day+1 from demo_cte
 where DateAdd(day,1,Min_Date)<=Max_date

)
select OrderId,Min_Date Stat_days,Min_Day  from demo_cte
order by orderid

SQL Fiddle