是否可以在没有任何嵌套查询的情况下为列表1中的每个城市编写查询,找到距离column2最近的城市并显示City1,City2和距离
Table:
City1, City2, Distance
例如
City1, city2, Distance
A B 10
A C 20
A D 30
E F 40
E G 10
re result should be:
A B 10
E G 40
感谢您的帮助
答案 0 :(得分:4)
这是greatest-n-per-group
查询的变体。 Stack Overflow上经常出现这种类型的查询。
SELECT c1.City1, c1.City2, c1.Distance
FROM Cities AS c1
LEFT OUTER JOIN Cities AS c2
ON c1.City1 = c2.City1 AND c1.Distance > c2.Distance
WHERE c2.City1 IS NULL;
换句话说,从行c1
中找到城市对,这样就没有其他城市对c2
存在相同的City1和更近的City2。
答案 1 :(得分:0)
如果您有权访问ROW_NUMBER()和公用表表达式(例如Oracle10g和SQL Server 2005等)......
WITH
ordered_results AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY City1 ORDER BY Distance, City2) AS rank,
City1,
City2,
Distance
FROM
Cities
)
SELECT
City1,
City2,
Distance
FROM
ordered_results
WHERE
rank = 1
根据“嵌套查询”的含义,您可能会接受或不接受。
但是,在任何合理大小的数据集中,我几乎都能保证找到最通用的解决方案。
答案 2 :(得分:0)
这不是最好的,但会
SELECT LEAST(city1,city2)city1, GREATEST(city1,city2)city2, 距离 距离 GROUP BY LEAST(city1,city2),GREATEST(city1,city2),距离