我可以使用Oracle中的转置功能来实现这个吗?

3
我写了一个视图,它给出了以下输出。
Vessel Name ETA
XYZ    1-Jul-12
XYZ    2-Jul-12
XYZ    3-Jul-12
XYZ    4-Jul-12
XYZ    5-Jul-12
XYZ    6-Jul-12
XYZ    7-Jul-12

实际上,我想要获得以下输出结果。
Vessel Name    ETA_1    ETA_2        ETA_3
XYZ           1-Jul-12  2-Jul-12    3-Jul-12
XYZ           2-Jul-12  3-Jul-12    4-Jul-12
XYZ           3-Jul-12  4-Jul-12    5-Jul-12
XYZ           4-Jul-12  5-Jul-12    6-Jul-12
XYZ           5-Jul-12  6-Jul-12    7-Jul-12

可能有许多船只可用。对于该船只可能有任意数量的预计到达时间,而不仅仅是5行。

为什么需要三个预计到达时间?如果一艘船从A港口出发于7月1日,则这将是ETA_FROM日期;然后在7月2日抵达B港口,则这将是ETA_VIA日期;最后,在7月3日抵达C港口,则这将是ETA_TO日期。然后,它又从C港口出发前往D港口,并在7月4日至5日之间到达。在这种情况下,ETA_FROM日期应为7月2日,ETA_VIA日期应为7月3日,ETA_TO日期应为7月4日。三个预计到达时间中最早的是ETA_FROM日期,接下来是ETA_VIA日期,最后是ETA_TO日期。

编辑:我尝试过这样做,但性能很差:

select t1.vessel_name,
       t1.eta ETA_FROM ,
       t2.eta ETA_VIA , 
       t3.eta ETA_TO 
from 
  test t1,
  test t2, 
  test t3 
where t1.eta<t2.eta and 
      t3.eta>t2.eta and 
      t1.eta=(select max(test.eta) 
              from test 
              where test.eta<t2.eta) 
      and t3.eta= (select min(test.eta) 
                   from test 
                   where test.eta>t2.eta) 

请改进示例,添加另一个容器。解释规则。为什么输出中恰好有5行?为什么有三个预计到达时间(ETA)? - Florin Ghita
可能有任意数量的船只可用。而且对于该船只可能存在任意数量的预计到达时间,不仅仅是5行。 - Preethi
输入有7行,输出只有5行。为什么是5?为什么不是4? - Florin Ghita
可能有任意数量的船只可用。而且对于该船只,可能有任意数量的预计到达时间,不仅限于5行。为什么有三个预计到达时间?一艘船从A港口出发于7月1日,这将是ETA_FROM日期,然后到达B港口于7月2日,这将是ETA_VIA日期,最后到达C港口于7月3日,这将是ETA_TO日期。然后它再次从C港口出发前往D港口,于2012年7月4日至7月5日之间。在这种情况下,ETA_FROM日期将是7月2日,ETA_VIA日期将是7月3日,ETA_TO日期应为7月4日。三个预计到达时间中最早的是ETA_FROM日期,接下来较晚的是ETA_VIA日期,再接下来是ETA_TO日期。 - Preethi
现在,这是一个解释。数据本身没有意义 :) 我会把它添加到问题中。 - Florin Ghita
谢谢Florin。我已经编写了一个查询来实现这个结果。选择 t1.vessel_name,t1.eta ETA_FROM,t2.eta ETA_VIA,t3.eta ETA_TO 从测试t1,测试t2,测试t3其中t1.eta<t2.eta且t3.eta>t2.eta并且t1.eta=(从测试中选择max(test.eta)where test.eta<t2.eta)和t3.eta= (从测试中选择min(test.eta)where test.eta>t2.eta)但是对于大量数据,这不起作用。 - Preethi
1个回答

3
select 
    * 
from (
    select 
        vessel, 
        eta, 
        lead(eta) over (order by eta) as eta2,
        lead(port) over (order by eta) as port2,
        lead(eta,2) over (order by eta) as eta3,
        lead(port,2) over (order by eta) as port3
    from your_view
)
where 
     eta3 is not null;

非常感谢您,Florin。它完美地运行了:)我还有一个疑问。实际上,该表格还具有港口和ETD信息。我需要这个ETA的港口和ETD信息。这可能吗?船舶在A港的预计到达时间是7月1日,从A港的预计离港时间是7月2日。所以我能获取相应的信息吗? - Preethi
嗨,Florin。非常感谢你。我一直在苦苦挣扎这个查询。你只用了一秒钟就解决了它。谢谢。 - Preethi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接