最短旅行时间

时间:2019-04-19 09:11:03

标签: oracle

显示具有最少旅行时间的schedule_id,来源,目的地和travel_time。根据计划ID对结果进行排序。

我已经尝试过这段代码,但是由于出现错误,查询中缺少一些内容。

here is the schema for the query

 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;

3 个答案:

答案 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;