2010-06-10 55 views
4

我有下表,它記錄每天的價值。問題是有時候會缺少幾天。我想寫一個SQL查詢,將:SQL Server Interpolate缺少行

  1. 返回缺少的天
  2. 計算缺失值使用線性插值

所以從以下源表:

Date   Value 
-------------------- 
2010/01/10  10 
2010/01/11  15 
2010/01/13  25 
2010/01/16  40 

我想回報:

Date   Value 
-------------------- 
2010/01/10  10 
2010/01/11  15 
2010/01/12  20 
2010/01/13  25 
2010/01/14  30 
2010/01/15  35 
2010/01/16  40 

任何幫助將不勝感激。

回答

3
declare @MaxDate date 
declare @MinDate date 

select @MaxDate = MAX([Date]), 
     @MinDate = MIN([Date]) 
from Dates 

declare @MaxValue int 
declare @MinValue int 

select @MaxValue = [Value] from Dates where [Date] = @MaxDate 
select @MinValue = [Value] from Dates where [Date] = @MinDate 

declare @diff int 
select @diff = DATEDIFF(d, @MinDate, @MaxDate) 

declare @increment int 
set @increment = (@MaxValue - @MinValue)/@diff 

select @increment 

declare @jaggedDates as table 
(
    PID INT IDENTITY(1,1) PRIMARY KEY, 
    ThisDate date, 
    ThisValue int 
) 

declare @finalDates as table 
(
    PID INT IDENTITY(1,1) PRIMARY KEY, 
    [Date] date, 
    Value int 
) 

declare @thisDate date 
declare @thisValue int 
declare @nextDate date 
declare @nextValue int 

declare @count int 
insert @jaggedDates select [Date], [Value] from Dates 
select @count = @@ROWCOUNT 

declare @thisId int 
set @thisId = 1 
declare @entryDiff int 
declare @missingDate date 
declare @missingValue int 

while @thisId <= @count 
begin 
    select @thisDate = ThisDate, 
      @thisValue = ThisValue 
    from @jaggedDates 
    where PID = @thisId 

    insert @finalDates values (@thisDate, @thisValue) 

    if @thisId < @count 
    begin 
     select @nextDate = ThisDate, 
      @nextValue = ThisValue 
     from @jaggedDates 
     where PID = @thisId + 1 

     select @entryDiff = DATEDIFF(d, @thisDate, @nextDate) 
     if @entryDiff > 1 
     begin 
      set @missingDate = @thisDate 
      set @missingValue = @thisValue 
      while @entryDiff > 1 
      begin 
       set @missingDate = DATEADD(d, 1, @missingDate) 
       set @missingValue = @missingValue + @increment 
       insert @finalDates values (@missingDate, @missingValue) 
       set @entryDiff = @entryDiff - 1 
      end 
     end 
    end 

    set @thisId = @thisId + 1 
end 

select * from @finalDates 
+0

感謝GalacticJello你是明星。就是我以後的樣子。 – SausageFingers 2010-06-10 22:43:42

+1

該解決方案基於表中的第一個和最後一個條目計算因子的缺失值。我稍微修改了代碼以重新計算基於任何給定行的前一個和下一個已知值的缺失值。在該行之後: 「其中PID = @thisId + 1」 添加行: 「select @diff = DATEDIFF(d,@thisDate,@nextDate)」 「set @increment =(@nextValue - @thisValue)/ @diff」 – SausageFingers 2010-06-13 17:41:43