用SQL实现线性插值(Linear Interpolation)

有些边界条件没有处理好,但是基本能用。 

-- # Input parameters # --
DECLARE @Value table
(
    value float
);
INSERT INTO @Value
VALUES
    (0.5)
  , (1)
  , (1.5)
  , (7)
  , (7.5);
 
DECLARE @X table
(
    x float
);
INSERT INTO @X
VALUES
    (1)
  , (2)
  , (3)
  , (4)
  , (5)
  , (6)
  , (7);
 
DECLARE @Y table
(
    y float
);
INSERT INTO @Y
VALUES
    (2)
  , (4)
  , (6)
  , (8)
  , (10)
  , (12)
  , (14);
 
-- # Core # --
DECLARE @MinX float, @MaxX float, @MinY float, @MaxY float;
 
SELECT @MinX = min(X.x)
     , @MaxX = max(X.x)
FROM
    @X X;
 
SELECT @MinY = min(Y.y)
     , @MaxY = max(Y.y)
FROM
    @Y Y;
 
WITH T AS
(
SELECT X.RowNumber
     , X.x
     , Y.y
FROM
    (SELECT row_number() OVER (ORDER BY X.x) RowNumber
          , X.x
     FROM
         @X X) X
    INNER JOIN (SELECT row_number() OVER (ORDER BY Y.y) RowNumber
                     , Y.y
                FROM
                    @Y Y) Y
        ON Y.RowNumber = X.RowNumber
)
SELECT V.value
     , CASE
           WHEN V.value < @MinX THEN
               @MinY
           WHEN V.value > @MaxX THEN
               @MaxY
           ELSE
               lowerT.y + (upperT.y - lowerT.y) / (upperT.x - lowerT.x) * (V.value - lowerT.x)
       END
FROM
    @Value V
    CROSS JOIN T lowerT
    LEFT JOIN T upperT
        ON upperT.RowNumber = lowerT.RowNumber + 1
WHERE
    (lowerT.x <= V.value
    AND upperT.x >= V.value)
    OR (upperT.RowNumber IS NULL
    AND (V.value > @MaxX
    OR V.value < @MinX));

 

转载于:https://www.cnblogs.com/deepnight/archive/2012/03/15/2398080.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值