Oracle:将一行及其下一行合并到同一行

时间:2015-09-03 09:14:12

标签: sql oracle views

我有一个问题。

我有这些4 rows数据:

来源目的地距离运营商价格

Miami New-York     800      BF      500

Dallas Chicago     300      AL      200

Dallas Chicago     300      KH      200

Miami New-York     800      JH      500

我想要的是将第2行和第3行合并为一行,如下所示:

Dallas Chicago 300 AL, KH 200(所有信息除了承运人外都是相同的)

问题是我必须检查上一行是否包含除了运营商之外的所有行的相同信息。

我怎样才能实现这一目标?使用LEADLAG

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

自我加入:

select t1.Origin, t1.Destination, t1.Distance, t1.Carrier, t2.Distance, t2.Carrier
from table t1
  join table t2 on  t1.Origin = t2.Origin
                and t1.Destination = t2.Destination
                and t1.Carrier < t2.Carrier

这里的行顺序并不重要。 (当然,那是dbms的方式!)

如果您也想单独返回航班,请LEFT JOIN而不是JOIN

答案 1 :(得分:0)

你走了。但它也将增加迈阿密纽约排。如果您只想合并2个adjecent行,那么您需要另一个列,如ID或InsertDate或类似的东西。然后我们可以修改给定的查询以基于它进行聚合。

              with tbl  (Origin, Destination, Distance ,Carrier ,Price)
              as
              (select 'Miami','New-York',800,'BF ', 500 from dual union
              select 'Dallas','Chicago',300,' AL', 200 from dual union
              select 'Dallas','Chicago',300,' KH', 200 from dual union
              select 'Miami','New-York',800,'JH',500 from dual)

              select Origin,Destination,Distance,listagg(carrier,',')  WITHIN GROUP (ORDER BY origin ) as AggCarrier,Price from tbl
              group by  Origin,Destination,Distance,Price

输出

      Origin  Destination Distance AggCarrier Price                 
      Miami     New-York    800     BF ,JH     500
      Dallas    Chicago     300     AL, KH     200

编辑:除非我们有任何列来识别数据的插入顺序,否则无法达到您想要的效果。请参阅以下示例。我尝试将addidng rownum添加到您的数据中。但它不会以你想要的方式分配rownum。它必须来自您想要使用的表。请参阅下面的示例。

          with tbl  (Origin, Destination, Distance ,Carrier ,Price)
          as
          (select 'Miami','New-York',800,'BF', 500 from dual union
          select 'Dallas','Chicago',300,'AL', 200 from dual union
          select 'Dallas','Chicago',300,'KH', 200 from dual union
          select 'Miami','New-York',800,'JH',500 from dual
          )
          select rownum,tbl.* from tbl

在达拉斯之前输出没有回到迈阿密第一排。

      ROWNUM ORIGIN DESTINATION DISTANCE CARRIER PRICE             
      1      Dallas Chicago     300      AL      200
      2      Dallas Chicago     300      KH      200
      3      Miami  New-York    800      BF      500
      4      Miami  New-York    800      JH      500 

所以你需要任何东西。 ID / InsertTime或任何其他标识符来查找。其他DB永远不会知道先插入了哪条记录。请求它达到你想要的效果。