我有一张这样的桌子......
我所追求的是SQL中实现此目的的一种方式......
我不需要的红线,因为我已经有效地将日期转移到了#end_date'列向上由1. ie:我想要丢弃或忽略行
日期基于开始日期和结束日期 - 第二行或下一行,其中FROMCODE和TOCODE 彼此相对。所以为了更好地解释,我想要做的是GROUP BY每两行有FROMCODE =下一行的TOCODE并且为了保持一致性,我想确保第一行的TOCODE =第二行的FROMCODE,等等。
我希望自己清楚明白。
我尝试使用递归JOIN,使用子JOIN的FROMCODE = TOCODE和子连接的TOCODE = FROMCODE链接下一行,并确保记录具有相同的VOYAGE_ID且RANK更大而不是第一排的排名。但我得到的只是胡言乱语。
答案 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
会移除最后一行,也会找到下一个结束日期。