我可以在oracle中使用转置功能来实现这一目标吗?

时间:2013-07-05 05:08:49

标签: sql oracle

我写了一个视图,它给了我以下输出

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排的船只,可能没有任何ETA。

为什么选择三个etas?一艘船将于01年1月从A港航行,然后是ETA_FROM日期,并于02年7月在B港口航行,那么这将是ETA_VIA和3月3日至C港口,那么这将是ETA_TO。然后它将于2012年7月4日在7月7日从C港航行到D,然后在这种情况下,ETA_FROM将是02-Jul,ETA_VIA将是03-Jul,ETA_TO应该是4-Jul。三个eta中最小的是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) 

1 个答案:

答案 0 :(得分: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;