SQL每日一题12:求解最小绝对值

64 阅读2分钟

题目

表 T20191113保存了一些点在 X 轴上的坐标,这些坐标都是整数。 写一个查询语句,找到这些点中最近两个点之间的距离。

最近距离显然是 '1' ,是点 '-1' 和 '0' 之间的距离。所以输出应该如下:

注意:每个点都与其他点坐标不同,表 T20191113不会有重复坐标出现。

参考答案

方法一:
--SQL server写法
create table T20191113
(
X int
)

insert into T20191113 values (-1);
insert into T20191113 values (0);
insert into T20191113 values (2);

select top 1 abs(p1.X-p2.X) as shortest
from T20191113 p1
inner join T20191113 p2
on p1.X<>p2.X
order by shortest

--MySQL写法
方法一:
select abs(p1.X-p2.X) as shortest
from T20191113 p1
inner join T20191113 p2
on p1.X<>p2.X
order by shortest
limit 1

方法二:
select min(abs(p1.X-p2.X)) as shortest
from T20191113 p1
inner join T20191113 p2
on p1.X<>p2.X

答案解析

根据题意我们要求两点之间的差值的最小值,那就涉及到自连接,题目要求每个点的坐标都不相同,那就是要求坐标点不相等(p1.X<>p2.X),这样剩下的点来求差值再取最小值就是我们要求的结果了。

SQL Server代码中通过绝对值函数(abs())来保证两点之间的差值不出现负值,而TOP 1 则是经过排序后取的最小的一个,这里同样可以使用聚合函数min来实现。

在Mysql的解法中,方法一与SQL Server的解法类似,通过limit来取最小的一个

方法二则通过min函数来取最小的一个,这个不需要排序