gpt4 book ai didi

sql - 选择边界最长的州

转载 作者:行者123 更新时间:2023-12-02 01:26:08 27 4
gpt4 key购买 nike

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

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

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

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

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

预期结果:因为从我们的数据来看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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com