基于对其他值进行分组来创建列

时间:2016-06-06 10:25:09

标签: sql sql-server tsql sql-server-2008-r2 grouping

我在制定问题时遇到困难。 我有一个带来这些结果的观点。需要在视图中添加一列,该列将配对具有相同编号的往返航班。

Flt_No  From_Airport    To_Airport  Dep_Date           RequiredResult
124    |LCA             |CDG        |10/19/14 5:00     1
125    |CDG             |LCA        |10/19/14 10:00    1
197    |LCA             |BCN        |10/4/12 5:00      2
198    |BCN             |LCA        |10/4/12 11:00     2
501    |LCA             |HER        |15/8/12 12:05     3
502    |HER             |LCA        |15/8/12 15:15     3

即。 124航班从拉纳卡飞往CDG,125航班从CDG返回拉纳卡 - 它们都必须具有相同的标识符。
往返航班的航班号始终如下 我有一堆条件,我现在不会写 省略时间不是一种选择,它们很重要 我在考虑dense_rank(),但我不知道如何为2个不同号码的航班创建一个标识符,请帮忙。

3 个答案:

答案 0 :(得分:0)

加入条件不仅限于简单的相等。假设{Flight No,Departure,Destination}在任何一天都是唯一的,那么自我加入应该这样做:

select whatever
from flights outbound
  inner join flights inbound on outbound.flt_no+1 = inbound.flt_no
                          and cast(outbound.dep_date, date)
                              = cast(inbound.dep_date, date)
                          and outbound.From_Airport = inbound.To_Airport
                          and outbound.To_Airpott = inbound.From_Ariport

答案 1 :(得分:0)

如果您的数据类似于发布的样本数据,则以下查询应提供所需的结果:

SELECT *,
       DENSE_RANK() OVER (ORDER BY CASE 
                                      WHEN From_Airport < To_Airport THEN From_Airport
                                      ELSE To_Airport
                                   END)
FROM mytable

答案 2 :(得分:0)

以为我会在记事本中尝试一下。

select 
 flt_no, from_airport, to_airport, dep_date,
 dense_rank() over (order by 
   convert(varchar,dep_date, 112),
   (case when from_airport < to_airport then coalesce(from_airport, to_airport) else coalesce(to_airport, from_airport) end)
 ) as RankNum
from flights;