0

SQL Server 2008 R2 には、注文が特定のステータスにあった日数 (DaysInStatus) を含むテーブル (StatDays) があります。このテーブルに書き込むプロセスがなかった日曜日を除いて、注文がそのステータスのままだった日ごとにエントリがあります。その場合、注文は月曜日に再び表示され、DaysInStatus は 2 日進んでいます。

私の問題は、不足している日曜日の値を入力する方法です。(注文に土曜日のエントリがあり、月曜日のエントリがない場合、その土曜日が最後のデータ ポイントであると想定しています。)

例:

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 を別のテーブルに挿入 (または選択) したいと思います。

また、OrderID は、DaysInStatus = 1 でこのテーブルに常に表示されるとは限りません。ほぼすべての値で表示され、ほとんどすべての値でドロップアウトされます。

日付テーブルを生成してから、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 に答える