2010-06-10 23 views
4

J'ai le tableau suivant qui enregistre une valeur par jour. Le problème est que parfois des jours manquent. Je veux écrire une requête SQL qui:SQL Server Interpoler Lignes manquantes

  1. Retour les jours manquants
  2. Calculer la valeur manquante par interpolation linéaire

donc de la table source suivante:

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

Je veux retourner:

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 

Toute aide serait grandement appréciée.

Répondre

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

Merci GalacticJello vous êtes une étoile. Juste ce que j'étais après. – SausageFingers

+1

Cette solution calcule les valeurs manquantes sur un facteur en fonction de la première et dernière entrée de la table. J'ai légèrement modifié le code pour recalculer les valeurs manquantes en fonction des valeurs connues précédentes et suivantes sur une ligne donnée. Après la ligne: "où PID = @thisId + 1" Ajouter les lignes: "sélectionnez @diff = DATEDIFF (d, @thisDate, @nextDate)" "set @increment = (@nextValue - @thisValue)/@diff " – SausageFingers