0

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

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

例子:

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

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

此外,在 DaysInStatus = 1 时,OrderID 不会总是出现在此表中。 In 几乎可以出现在任何值处,并且几乎可以在任何值处退出。

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

在此先感谢您的任何建议!

4

2 回答 2

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

于 2013-01-31T05:15:46.650 回答
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小提琴

于 2013-01-31T05:38:15.507 回答