Sql 在同一列中选择列值和与其最近/最近的值

Sql 在同一列中选择列值和与其最近/最近的值,sql,teradata,Sql,Teradata,我有两个专栏 Key,Val 1 31 2 43 3 41 4 100 我的预期产出是 Key,Val,closestVal 1 31 41 2 43 41 3 41 43 4 100 43 要获得预期的输出,最简单的sql查询是什么?我们可以在这里使用ABS和行号: 注意:上面的演示是针对SQL Server的,而不是Teradata。如果KEY是Teradata中的保留关键字,那么如果您打算将其用作列名,则必须将其转义

我有两个专栏

Key,Val
1    31
2    43
3    41
4    100
我的预期产出是

Key,Val,closestVal
1    31    41
2    43    41
3    41    43
4    100   43
要获得预期的输出,最简单的sql查询是什么?

我们可以在这里使用ABS和行号:


注意:上面的演示是针对SQL Server的,而不是Teradata。如果KEY是Teradata中的保留关键字,那么如果您打算将其用作列名,则必须将其转义。

我认为性能最好的查询将使用lag和lead-出于某种原因,Teradata不直接支持它。但是:

select t.*,
       (case when abs(val - min(val) over (order by val rows between 1 preceding and 1 preceding)) <
                  abs(val - min(val) over (order by val rows between 1 following and 1 following)
            then min(val) over (order by val rows between 1 preceding and 1 preceding))
            else min(val) over (order by val rows between 1 following and 1 following)
        end) as closest_val
from t;

换句话说,不需要子查询或连接,只需要窗口功能。

谢谢Tim的回答我还有另一个问题我应该在这里问还是应该作为另一个问题发布?@Mohsin如果它与您在这里问的问题有很大不同,那么是的,你应该打开一个新问题。在接下来的三个小时里,他们不会让我再问另一个问题,我只是想知道如果我们要选择两个值x1,y1和两个最接近的值x1,最接近的值y1,其中x1,y1欧氏距离或任何其他距离最小。问题是:如果我们要选择两个值x1,y1和两个最接近的值_x1,最接近的_y1,其中x1,y1欧氏距离或任何其他距离minimum@Mohsin . . . 首先,新问题应该以新问题的形式提出,而不是在评论中提出。其次,您只需将公式按顺序排列即可。问题是:从字面上看,您的答案包含了我见过的最多百分比的SQL关键字:-
select t.*,
       (case when abs(val - min(val) over (order by val rows between 1 preceding and 1 preceding)) <
                  abs(val - min(val) over (order by val rows between 1 following and 1 following)
            then min(val) over (order by val rows between 1 preceding and 1 preceding))
            else min(val) over (order by val rows between 1 following and 1 following)
        end) as closest_val
from t;