如何基于类似数据对每个第2条记录进行分区?

时间:2018-06-08 06:43:08

标签: sql sql-server sql-server-2008

我有一张这样的桌子......

enter image description here

我所追求的是SQL中实现此目的的一种方式......

enter image description here

我不需要的红线,因为我已经有效地将日期转移到了#end_date'列向上由1. ie:我想要丢弃或忽略行

日期基于开始日期和结束日期 - 第二行或下一行,其中FROMCODE和TOCODE 彼此相对。所以为了更好地解释,我想要做的是GROUP BY每两行有FROMCODE =下一行的TOCODE并且为了保持一致性,我想确保第一行的TOCODE =第二行的FROMCODE,等等。

我希望自己清楚明白。

我尝试使用递归JOIN,使用子JOIN的FROMCODE = TOCODE和子连接的TOCODE = FROMCODE链接下一行,并确保记录具有相同的VOYAGE_ID且RANK更大而不是第一排的排名。但我得到的只是胡言乱语。

2 个答案:

答案 0 :(得分:1)

您可以使用outer apply

select t.*, tt.end_date as new_end_date
from table t outer apply (
      select top 1 t1.end_date
      from table t1
      where t1.voyage_id = t.voyage_id and
            t1.rank > t.rank
      order by t1.rank
) tt
where tt.end_date is not null;

答案 1 :(得分:1)

您可以使用left join解决此问题 - 假设rank没有间隙:

select t.*,
       tnext.end_date as new_end_date
from t join
     t tnext
     on tnext.voyage_id = t.voyage_id and tnext.rank = t.rank + 1;

请注意,join会移除最后一行,也会找到下一个结束日期。