Sql 选择两个值以及前一个值与之具有最小距离的两个值

Sql 选择两个值以及前一个值与之具有最小距离的两个值,sql,teradata,Sql,Teradata,我有三个专栏 Key, x1, y1 1 31 34 2 43 40 3 41 44 4 100 40 我的预期产出是: Key, x1, y2, closest_x1, closest_y2 1 31 34 43 40 2 43 40 41 44 3 41 44 43 40 4 100 40 41 44

我有三个专栏

Key, x1,  y1
1    31   34
2    43   40
3    41   44
4    100  40
我的预期产出是:

Key, x1,  y2, closest_x1,  closest_y2
1    31   34     43          40
2    43   40     41          44
3    41   44     43          40
4    100  40     41          44 
要获得预期的输出,最简单的sql查询是什么?
请注意,在查找最接近的一对时,会考虑x1和y1这两个值。我认为在预期结果的第4行中,最接近的值是错误的。 应该是:

4   100 40  43  40
至少这是我从中得到的结果:

select t.*, tt.x1 closest_x1, tt.y1 closest_y1
from tablename t
inner join tablename tt
on tt.key = (
  select min(key) from tablename where power(x1 - t.x1, 2) + power(y1 - t.y1, 2) = (
    select min(power(x1 - t.x1, 2) + power(y1 - t.y1, 2)) from tablename where key <> t.key
  )
)
order by t.key

我认为在预期结果的第4行中,最接近的值是错误的。 应该是:

4   100 40  43  40
至少这是我从中得到的结果:

select t.*, tt.x1 closest_x1, tt.y1 closest_y1
from tablename t
inner join tablename tt
on tt.key = (
  select min(key) from tablename where power(x1 - t.x1, 2) + power(y1 - t.y1, 2) = (
    select min(power(x1 - t.x1, 2) + power(y1 - t.y1, 2)) from tablename where key <> t.key
  )
)
order by t.key

用例的一个可能解决方案是使用NOT EXIST子句自联接表,以确保所联接的记录是最接近当前记录的记录

SELECT t1.*, t2.x closest_x, t2.y closest_y
FROM mytable t1
INNER JOIN mytable t2
    ON t2.k <> t1.k
    AND NOT EXISTS (
        SELECT 1
        FROM mytable t3
        WHERE
            t3.k <> t1.k
            AND abs(t1.x - t3.x) + abs(t1.y - t3.y) < abs(t1.x - t2.x) + abs(t1.y - t2.y)  
    )
ORDER BY 1;
SELECT t1.*, t2.x closest_x, t2.y closest_y
FROM mytable t1
INNER JOIN mytable t2
    ON t2.k <> t1.k
    AND NOT EXISTS (
        SELECT 1
        FROM mytable t3
        WHERE
            t3.k <> t1.k
            AND abs(t1.x - t3.x) + abs(t1.y - t3.y) < abs(t1.x - t2.x) + abs(t1.y - t2.y)  
    )
ORDER BY 1;

用例的一个可能解决方案是使用NOT EXIST子句自联接表,以确保所联接的记录是最接近当前记录的记录

SELECT t1.*, t2.x closest_x, t2.y closest_y
FROM mytable t1
INNER JOIN mytable t2
    ON t2.k <> t1.k
    AND NOT EXISTS (
        SELECT 1
        FROM mytable t3
        WHERE
            t3.k <> t1.k
            AND abs(t1.x - t3.x) + abs(t1.y - t3.y) < abs(t1.x - t2.x) + abs(t1.y - t2.y)  
    )
ORDER BY 1;
SELECT t1.*, t2.x closest_x, t2.y closest_y
FROM mytable t1
INNER JOIN mytable t2
    ON t2.k <> t1.k
    AND NOT EXISTS (
        SELECT 1
        FROM mytable t3
        WHERE
            t3.k <> t1.k
            AND abs(t1.x - t3.x) + abs(t1.y - t3.y) < abs(t1.x - t2.x) + abs(t1.y - t2.y)  
    )
ORDER BY 1;

你用哪条规则来判断哪一对是最近的?@GMB可以简单到ABX2-x1+absy2-y1或欧几里德距离。欧几里德距离:你有地理空间数据吗?Teradata有一个地理空间数据类型,该数据类型包含地理空间索引…您使用哪条规则来判断哪一对是最接近的一对?@GMB可以简单到ABX2-x1+absy2-y1或欧几里德距离欧几里德距离:您有地理空间数据吗?Teradata有一个地理空间数据类型,该数据类型包含地理空间索引…与我所想到的解决方案完全相同。向上投票,和我想的完全一样。我一直认为OP想要2D距离,但我可能错了。向上投票。@TheImpler:我完全同意你的看法,但OP在评论中给出了欧几里得公式……我一直认为OP想要2D距离,但我可能错了。向上投票。@TheImpler:我完全同意你的看法,但OP在评论中给出了欧几里得公式。。。