выберите значение столбца и ближайшее / ближайшее значение из него в том же столбце - PullRequest
0 голосов
/ 27 января 2019

У меня есть два столбца

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-запрос может иметь ожидаемый результат?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Я думаю, что наиболее производительный запрос будет использовать 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;

Другими словами, никаких подзапросов или объединений не требуется, только оконные функции.

0 голосов
/ 27 января 2019

Мы можем использовать ABS вместе с ROW_NUMBER здесь:

WITH cte AS (
    SELECT t1.Key, t1.Val, t2.Val AS closestVal,
        ROW_NUMBER() OVER (PARTITION BY t1.Key ORDER BY ABS(t1.Val - t2.Val)) rn
    FROM yourTable t1
    INNER JOIN yourTable t2
        ON t1.Key <> t2.Key
)

SELECT Key, Val, closestVal
FROM cte
WHERE rn = 1;

enter image description here

Демо

Примечание. Приведенная выше демонстрация предназначена для SQL Server, а не для Teradata.Если KEY является зарезервированным ключевым словом в Teradata, вам придется его избегать, если вы планируете использовать его в качестве имени столбца.

...