表达这个问题的另一种方法是找到赛车手没有参加比赛的最近一年。然后,当前年份减去该年份提供连续年份数。
您可以通过在年份和赛车手之间进行交叉连接来获得最近的年份,并在左侧加入应用程序。没有比赛的地方就是那个赛车手没有参加比赛的一年。
您确实必须做一些额外的簿记来处理多年来参加比赛的赛车手。最后的查询是:
select racers.racer_id,
maxyear - max(case when a.race_year is null then years.race_year
else const.minyear - 1
end)
from (select distinct race_year
from applications
) years cross join
(select distinct racer_id
from applications
) racers cross join
(select max(race_year) as maxyear, min(race_year) as minyear
from applications
) const left outer join
applications a
on a.race_year = years.race_year and
a.racer_id = racers.racer_id
group by racers.racer_id;
我不确定这与 SQL Fiddle 中的数据有何关系。那里有四个赛车手,但问题中有 8 个建议值。
编辑:
现在我懂了。这很合理。下面的查询基本上扩展了上面的想法,加入到application
没有应用程序的最大年份之后的任何年份。子查询是上面的简化:
select a.racer_id
from (select racers.racer_id,
max(case when a.race_year is null then years.race_year
end) as maxyear
from (select distinct race_year
from applications
) years cross join
(select distinct racer_id
from applications
) racers left outer join
applications a
on a.race_year = years.race_year and
a.racer_id = racers.racer_id
group by racers.racer_id
) ry join
applications a
on a.racer_id = ry.racer_id and
(a.race_year > ry.maxyear or ry.maxyear is null);