(SQL) 创建 Table 与单独 Table 的距离与 XY 坐标
(SQL) Create Table with Distances from Separate Table with XY Coordinates
我正在尝试创建一个 table,它基于以下数据集在老虎机之间具有唯一的距离。
我知道我首先需要计算距离,目前我知道的唯一方法是使用以下代码:
select (SELECT abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
FROM dim_slot_coordinates p1
CROSS JOIN dim_slot_coordinates p2
WHERE p1.slot_machine_id = 1 and p2.slot_machine_id = 2
但这显然只是returns前两台机器之间的距离。如何计算所有机器之间的距离?那么,我该如何正确地确保每个距离都是唯一的呢?
在 SQL 中执行此操作的最简单方法是什么?
感谢您的帮助!
如果您只想找到所有机器之间的距离,我不会使用 CROSS JOIN,因为它显然会为您提供所有组合。原因是,如果您需要唯一的距离,那么您很快就会 运行 遇到问题,因为机器 1 和机器 2 之间的距离与机器 2 和机器 1 之间的距离相同。
使用你的距离公式这就是我得到列表的方式:
CREATE TABLE #dim_slot_coordinates(slot_machine_id int, coordinate_x int, coordinate_y int)
INSERT INTO #dim_slot_coordinates VALUES (1,1,1),(2,2,5),(3,-2,3),(4,-5,-5),(5,5,-3)
SELECT p1.slot_machine_id SM1,p2.slot_machine_id SM2,
(SELECT abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
FROM #dim_slot_coordinates p1
CROSS APPLY(
SELECT *
FROM #dim_slot_coordinates
WHERE slot_machine_id > p1.slot_machine_id) p2
order by sm1
至于正确确保每个距离都是唯一的,这听起来像是您想在 table 放置此数据的距离上设置唯一约束进入.
您只需使用 cross join
:
select p1.slot_machine_id, p2.slot_machine_id,
(abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
from dim_slot_coordinates p1 CROSS JOIN
dim_slot_coordinates p2;
如果你想让两台机器之间的距离只计算一次,那么加上一个不等式:
select p1.slot_machine_id, p2.slot_machine_id,
(abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
from dim_slot_coordinates p1 CROSS JOIN
dim_slot_coordinates p2
where p1.slot_machine_id < p2.slot_machine_id;
编辑:
如果你想要“唯一”的距离,你可以使用:
select distinct p1.slot_machine_id
(abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
from dim_slot_coordinates p1 CROSS JOIN
dim_slot_coordinates p2
where p1.slot_machine_id <> p2.slot_machine_id;
这对我来说似乎没有用,但它确实为每台机器提供了一个独特距离的列表。
我正在尝试创建一个 table,它基于以下数据集在老虎机之间具有唯一的距离。
我知道我首先需要计算距离,目前我知道的唯一方法是使用以下代码:
select (SELECT abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
FROM dim_slot_coordinates p1
CROSS JOIN dim_slot_coordinates p2
WHERE p1.slot_machine_id = 1 and p2.slot_machine_id = 2
但这显然只是returns前两台机器之间的距离。如何计算所有机器之间的距离?那么,我该如何正确地确保每个距离都是唯一的呢?
在 SQL 中执行此操作的最简单方法是什么?
感谢您的帮助!
如果您只想找到所有机器之间的距离,我不会使用 CROSS JOIN,因为它显然会为您提供所有组合。原因是,如果您需要唯一的距离,那么您很快就会 运行 遇到问题,因为机器 1 和机器 2 之间的距离与机器 2 和机器 1 之间的距离相同。
使用你的距离公式这就是我得到列表的方式:
CREATE TABLE #dim_slot_coordinates(slot_machine_id int, coordinate_x int, coordinate_y int)
INSERT INTO #dim_slot_coordinates VALUES (1,1,1),(2,2,5),(3,-2,3),(4,-5,-5),(5,5,-3)
SELECT p1.slot_machine_id SM1,p2.slot_machine_id SM2,
(SELECT abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
FROM #dim_slot_coordinates p1
CROSS APPLY(
SELECT *
FROM #dim_slot_coordinates
WHERE slot_machine_id > p1.slot_machine_id) p2
order by sm1
至于正确确保每个距离都是唯一的,这听起来像是您想在 table 放置此数据的距离上设置唯一约束进入.
您只需使用 cross join
:
select p1.slot_machine_id, p2.slot_machine_id,
(abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
from dim_slot_coordinates p1 CROSS JOIN
dim_slot_coordinates p2;
如果你想让两台机器之间的距离只计算一次,那么加上一个不等式:
select p1.slot_machine_id, p2.slot_machine_id,
(abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
from dim_slot_coordinates p1 CROSS JOIN
dim_slot_coordinates p2
where p1.slot_machine_id < p2.slot_machine_id;
编辑:
如果你想要“唯一”的距离,你可以使用:
select distinct p1.slot_machine_id
(abs(p1.coordinate_x - p2.coordinate_x) + abs(p1.coordinate_y - p2.coordinate_y)) as Distance
from dim_slot_coordinates p1 CROSS JOIN
dim_slot_coordinates p2
where p1.slot_machine_id <> p2.slot_machine_id;
这对我来说似乎没有用,但它确实为每台机器提供了一个独特距离的列表。