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在评论中给出了欧几里得公式。。。