显示具有最少旅行时间的schedule_id,来源,目的地和travel_time。根据计划ID对结果进行排序。
我已经尝试过这段代码,但是由于出现错误,查询中缺少一些内容。
select sh.schedule_id,sh.source,sh.destination,sh.duration as travel_time
from schedule sh
(select min(sh.duration) from schedule)
order by sh.schedule_id;
答案 0 :(得分:1)
几乎正确。您忘记了在子句中定义最短旅行时间。
SELECT sh.schedule_id,
sh.source,
sh.destination,
sh.duration as travel_time
FROM schedule sh
WHERE sh.duration = (select min(duration) from schedule) -- This is where the problem was.
ORDER BY sh.schedule_id;
答案 1 :(得分:1)
然后,行进时间类似的唯一列为DURATION
,其数据类型为NUMBER
。这个数字代表什么?分钟?小时?还有吗?
无论如何,这可能是您考虑的一种选择。它使用RANK
分析函数对持续时间(即“旅行时间”)进行“排序”,并获取持续时间最短的一行(或几行)。
这种方法的优点是您只需要扫描表一次。如果您在子查询中选择最短持续时间,然后使用其结果来获取您感兴趣的数据,则您将访问同一张表两次,这可能涉及很多行。对于较小的样本数据集,您不会发现任何差异。
SCHEDULE
CTE代表一些测试数据;您需要从第6行开始的代码。
SQL> with schedule (schedule_id, source, destination, duration) as
2 (select 1, 'Paris', 'London' , 8 from dual union all
3 select 2, 'Berlin', 'Prague' , 4 from dual union all
4 select 3, 'Zagreb', 'Budapest', 4 from dual
5 )
6 select schedule_id, source, destination, duration
7 from (select schedule_id, source, destination, duration,
8 rank() over (order by duration) rn
9 from schedule
10 )
11 where rn = 1;
SCHEDULE_ID SOURCE DESTINAT DURATION
----------- ------ -------- ----------
2 Berlin Prague 4
3 Zagreb Budapest 4
SQL>
答案 2 :(得分:0)
我想当您从同一张表访问数据时,不需要别名。
代码:
select
schedule_id,source,destination,duration from schedule
where duration = (select min(duration) from schedule)
order by schedule_id;