Ваш пример не показывает, и вы не объясняете, как вы определяете, какая строка является "верхней", поэтому я поставил ?????? в запросе, где необходимо указать столбец ранжирования, например
a desc
например. В любом случае, это именно то, для чего предназначены аналитические функции в SQL Server 2005 и более поздних версиях.
declare @howmany int = 3;
with TRanked (a,b,c,d,e,rk) as (
select
a,b,c,d,e,
rank() over (
partition by b,c,d
order by ???????
)
from T
)
select a,b,c,d,e
from TRanked
where rk <= @howmany;