【问题标题】:TSQL Insert missing dates and incrementsTSQL 插入缺失的日期和增量
【发布时间】:2013-01-31 13:38:15
【问题描述】:

在 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 插入(或选择)到另一个表中。

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

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

提前感谢您的任何建议!

【问题讨论】:

  • 假期也会缺席吗?

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


【解决方案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

【讨论】:

    【解决方案2】:

    试试这个。这将有助于任何缺少的日子。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多