我的第一次尝试很简单,但如果你有相思ST的情况下,一个正确的片段不是在正确的顺序。
select * from stackchallenge se
where not exists (select * from stackchallenge
where startchain = se.endchain and segment = se.segment)
and exists (select * from stackchallenge
where segment = se.segment and endchain > se.endchain)
with segments (segment,startchain,endchain,lenchain,segnum)
as (select segment,startchain,endchain,lenchain
,row_number() over (partition by segment order by startchain,endchain) segnum
from stackchallenge)
select s1.segment,s1.startchain,s1.endchain,s1.lenchain
,case when s1.endchain = s2.startchain then 'WIN!'
when s1.endchain <> s2.startchain then 'FAIL!'
else '' end result
from segments s1
left join segments s2 on s1.segment = s2.segment
and s1.segnum + 1 = s2.segnum
下面是用于测试的表和数据,您需要直接使用SQLServer2008。如果您正在使用Insert-to-sql2005,请更改其语法。
create table stackchallenge (segment varchar(100),
startchain int,
endchain int,
result varchar(100),
lenchain int
)
insert into stackchallenge (segment,startchain,endchain,result,lenchain)
values
('ACACIA ST (KLN)' , 1073 , 1149 , 'FAIL!' , 76),
('ACACIA ST (KLN)' , 1073 , 1151 , 'FAIL!' , 78),
('ACACIA ST (KLN)' , 1150 , 1332 , 'FAIL!' , 182),
('ACACIA ST (KLN)' , 1151 , 1332 , 'FAIL!' , 181),
('ACACIA ST (KLN)' , 1606 , 2079 , '' , 473),
('ACTIVITY ST (WRK)' , 6 , 215 , 'WIN!' , 209),
('ACTIVITY ST (WRK)' , 215 , 227 , 'WIN!' , 12),
('ACTIVITY ST (WRK)' , 227 , 423 , 'WIN!' , 196),
('ACTIVITY ST (WRK)' , 423 , 549 , 'WIN!' , 126),
('ACTIVITY ST (WRK)' , 549 , 600 , '' , 51),
('ADRIENNE CT (WMN)' , 5 , 107 , 'WIN!' , 102),
('ADRIENNE CT (WMN)' , 107 , 122 , '' , 15),
('AERODROME RD (LYB)' , 0 , 140 , 'WIN!' , 140),
('AERODROME RD (LYB)' , 140 , 428 , 'WIN!' , 288),
('AERODROME RD (LYB)' , 428 , 716 , 'WIN!' , 288),
('AERODROME RD (LYB)' , 716 , 998 , 'WIN!' , 282),
('AERODROME RD (LYB)' , 998 , 1280 , 'WIN!' , 282),
('AERODROME RD (LYB)' , 1280 , 1566 , 'WIN!' , 286),
('AERODROME RD (LYB)' , 1566 , 1851 , 'WIN!' , 285),
('AERODROME RD (LYB)' , 1851 , 2136 , 'WIN!' , 285),
('AERODROME RD (LYB)' , 2136 , 2421 , '' , 285)