Filtrando por RANK () na cláusula HAVING sem subconsultas

Estou buscando máximos em grupo (odata CTE emula um conjunto de junções de tabelas reais):

with data as (
    select 'Austria' as country, 1 as id, 'red' as colour, 120 as quantity
    union all select 'Austria', 2, 'green', 96
    union all select 'Austria', 3, 'blue', 103

    union all select 'Belgium', 1, 'red', 33
    union all select 'Belgium', 2, 'green', 12
    union all select 'Belgium', 3, 'blue', 40
)
select country, colour, quantity
from (
    select country, colour, quantity,
    rank() over (partition by country order by quantity desc, id) as position
    from data
    group by country, id, colour, quantity
) subquery
where position=1;

Isso funciona bem mas sou forçado a quebrar a consulta com oRANK() chame dentro de uma subconsulta, porque esta alternativa dispara um erro de sintaxe:

-- [...]
select country, colour, quantity,
rank() over (partition by country order by quantity desc, id) as position
from data
group by country, id, colour, quantity
having rank() over (partition by country order by quantity desc, id)=1;

As funções com janelas podem aparecer apenas nas cláusulas SELECT ou ORDER BY.

Existe uma sintaxe alternativa para evitar essa limitação ou a subconsulta é a única maneira sensata?

O objetivo final é integrar esse código em um conjunto maior de expressões SQL geradas dinamicamente. Se eu puder manter uma única consulta, basta definir as diferentes partes (selecionar, juntar tabelas, onde, agrupar por, ter e ordenar por) com matrizes. Caso contrário, preciso pensar em uma grande reescrita.