在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亿条记录,所以这对我不起作用。
提前感谢任何建议!
答案 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