我想查找与一个或多个其他州共享最长边界的州的名称?我有两个表状态和边框。提供的表格经过简化,只有 5 种状态
“状态” 代码是我们的关键,对于每个状态都是唯一的
“边界” 两个州代码来指代两个州之间的边界
预期结果: 因为从我们的数据来看IN有最长的边框,组合长度为20 + 50 + 40
编辑: 到目前为止我已经提出的查询。
SELECT s.name
FROM state s
INNER JOIN boarder b
ON s.code = b.code1
WHERE SUM(b.length);
我的想法是我想选择名称,将其与边框表连接起来。然后得到总和。我看到的两个问题是它列出了一堆名字,我只想要一个,而且我没有考虑另一侧的寄宿生。例如寄宿生表中的第一行。不存在两行单独的 MI、IN 和 IN、MI。那么我应该尝试在两侧进行两个子查询,但是我将如何添加长度?
最佳答案
假设数据不重复(因此您没有 MI/IN 和 IN/MI 的行),您可以直接对该表进行逆透视以获取每个州的所有单独边框长度:
select *
from borders
unpivot (code for code_idx in (code1 as 1, code2 as 2)) u
并将其连接到 states 表以获取匹配的名称:
...
join state s on s.code = u.code
然后使用 sum()
聚合函数获取每个状态的总长度:
select s.name, sum(u.length)
from borders
unpivot (code for code_idx in (code1 as 1, code2 as 2)) u
join state s on s.code = u.code
group by s.name
然后按总长度降序对结果进行排序,并选择第一行(即具有最高值的行):
select s.name
from borders
unpivot (code for code_idx in (code1 as 1, code2 as 2)) u
join state s on s.code = u.code
group by s.name
order by sum(u.length) desc
fetch first 1 row only
fiddle显示中间步骤,包括如何获取名称和总长度(如果您需要两者)。
如果您可能有联系,那么您需要决定是否选择其中之一 - 不确定地选择此查询将执行的操作,或者确定地通过将州代码添加到 order-by 子句中;或显示全部 - 改变 only
至with ties
.
如果您使用的是不支持fetch
的旧版本Oracle语法,您可以将查询放入内联 View 中并从中选择第一行。
The query i have made so far. ...
这也可以通过一些调整来实现,特别是更改无效的 where
order by
的条款;但您不需要像您建议的那样使用两个子查询,您可以修改联接条件以查看边框表中的两列:
on (s.code = b.code1 or s.code = b.code2)
然后如上所述,按总长度排序并获取第一个值:
select s.name
from state s
join borders b
on (s.code = b.code1 or s.code = b.code2)
group by s.name
order by sum(b.length) desc
fetch first 1 row only;
关于sql - 选择边界最长的州,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74631383/