我有一个问题。
我有这些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
(所有信息除了承运人外都是相同的)
问题是我必须检查上一行是否包含除了运营商之外的所有行的相同信息。
我怎样才能实现这一目标?使用LEAD
和LAG
?
感谢您的帮助。
答案 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永远不会知道先插入了哪条记录。请求它达到你想要的效果。