tsql - SQL Server 插入丢失的行

标签 tsql missing-data linear-interpolation

我有下表记录了每天的值。问题是有时几天不见了。我想编写一个 SQL 查询,它将:

  • 返回失踪天数
  • 使用线性插值计算缺失值

  • 所以从下面的源表:
    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
    

    任何帮助将不胜感激。

    最佳答案

    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
    

    关于tsql - SQL Server 插入丢失的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018112/

    相关文章:

    sql - 如何将 SQL 查询导出到 SPSS?

    sql-server - 用 THROW 替换 RAISERROR

    Java 或 SQL 在数组中添加缺失的月份

    java - 我将如何使用线性插值和链接列表制作颜色渐变?

    C++ 获取 1.#INF

    terrain - 如何计算地形数据上的点的坡度(例如数字高程矩阵)

    SQL Server 2005 - 达到表行大小限制

    sql - 用户定义函数最佳实践

    function - 为什么 SubString Vector 的一个元素不能被测试为条件评估 if (Julia)?

    r - 基础 R 中缺失值的面积图