我被http://www.sql-ex.ru/learn_exercises.php#answer_ref的练习68困住了。
数据库由以下四个表组成:
演习的目的是: 找出航班数量(旅行)最多的航线数量。 笔记。
我可以得到“找出航班数量(行程次数最多)的路线数量”的正确答案,但在考虑注释1时则不能:A - B和B - A被认为是相同路线。
我不知道如何获得独特的配对: 如果我们有输出:
| town_from | town_to | count |
| --------- | --------- | ----- |
| London | Singapore | 4 |
| Singapore | London | 4 |
如何选择以便它只给我
| town_from | town_to | count |
| --------- | --------- | ----- |
| London | Singapore | 4 |
我能够通过以下查询完成此问题:
WITH x AS( SELECT con,sum(c)as s FROM( SELECT town_from,town_to,'con'= CASE WHEN lower(town_from)
SELECT count(*)FROM x WHERE =(SELECT max(s)FROM x)
答案 0 :(得分:2)
您需要以表示from->的方式查看Trip
表格,方法与从&gt;表示的方式相同。执行此操作的典型方法是确保始终对其进行排序town_from <(=) town_to
。
通常来说,以下查询将以这种方式投影Trip
。 case子句从和从周围切换以保持它们始终排序:
select trip_no, id_comp, plane,
case when town_from < town_to then town_from else town_to end as town_from,
case when town_from < town_to then town_to else town_from end as town_to,
time_out, time_in
from Trip
然后,您可以在查询中选择此投影:
select ...
from (
select trip_no, id_comp, plane,
case when town_from < town_to then town_from else town_to end as town_from,
case when town_from < town_to then town_to else town_from end as town_to,
time_out, time_in
from Trip
) as x
要解决这个特殊问题,我们可以应用相同的逻辑,但删除不必要的列(优化器应该这样做但无论如何它对人眼看起来更干净):
select town_from, town_to, count(*)
from (
select
case when town_from < town_to then town_from else town_to end as town_from,
case when town_from < town_to then town_to else town_from end as town_to
from Trip
) as x
group by town_from, town_to
注意:如果我错了,请纠正我,但在您的预期输出中,伦敦&lt; - &gt;新加坡的总人数应该 8 ,而不是 4 。您在一个方向上有4次旅行,在另一个方向上有4次旅行,共计8次。
然后我们可以使用相同的查询来查找最大数量的航班,然后查找具有该号码的航线,然后计算。我怀疑你有这个部分,但这是一个练习。
答案 1 :(得分:0)
select a.town_from, a.town_to, count(a.plane) ta from (
select plane,
(case when town_from < town_to then town_from else town_to end) as town_from,
(case when town_from < town_to then town_to else town_from end) as town_to
from trip) as a
group by a.town_from, a.town_to
having count(a.plane) >= all (select count(plane) from trip group by plane, town_from, town_to)) s```