sql - 选择边界最长的州

标签 sql oracle

我想查找与一个或多个其他州共享最长边界的州的名称?我有两个表状态和边框。提供的表格经过简化,只有 5 种状态

“状态” 代码是我们的关键,对于每个状态都是唯一的

<表类=“s-表”> <标题> 姓名 代码 <正文> 密歇根州 MI 印第安纳州 在 伊利诺伊州 IL 俄亥俄州 哦 威斯康星州 WI

“边界” 两个州代码来指代两个州之间的边界

<表类=“s-表”> <标题> 代码1 代码2 长度 <正文> MI 在 20 IL 在 50 米 哦 5 在 哦 40 WI MI 30

预期结果: 因为从我们的数据来看IN有最长的边框,组合长度为20 + 50 + 40

<表类=“s-表”> <标题> 状态 <正文> 印第安纳州

编辑: 到目前为止我已经提出的查询。

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
<表类=“s-表”> <标题> 姓名 <正文> 印第安纳州

fiddle显示中间步骤,包括如何获取名称和总长度(如果您需要两者)。

如果您可能有联系,那么您需要决定是否选择其中之一 - 不确定地选择此查询将执行的操作,或者确定地通过将州代码添加到 order-by 子句中;或显示全部 - 改变 onlywith 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;
<表类=“s-表”> <标题> 姓名 <正文> 印第安纳州

fiddle

关于sql - 选择边界最长的州,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74631383/

相关文章:

mysql - 在 "case"的语句中使用 "where in"-

php - 如何将php变量插入到oracle表中?

c# - 在 C# 中为 INSERT 语句定义 SQL 参数

mysql - #1242 - 子查询返回超过 1 行

javascript - 通过使用某些值得的小表的 javascript 数组来支持它来降低查询的复杂性

Java 异常 : java. lang.UnsatisfiedLinkError : ocijdbc11. dll: %1 不是有效的 Win32 应用程序

sql - 我误解了联接吗?

php - Yii 框架数据库中的新列未显示在 $model->getAttributes() 方法调用的输出中?

oracle - 如何测试日期格式字符串是否是 Oracle 中的有效日期格式字符串

oracle - 在 Docker 中提交 Oracle 表空间时出错