Если вы видите «Стоимость запроса (относительно пакета):», то для первого запроса это заняло всего 33%, а для второго с «Top (1) со связями» - 67%, и если мы анализируем это отдельно, это дополнительная сортировка. оператор ...

ираю групповые максимумы (data CTE эмулирует набор соединений из реальных таблиц):

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;

Это отлично работает но я вынужден обернуть запрос сRANK() вызов внутри подзапроса, потому что эта альтернатива вызывает синтаксическую ошибку:

-- [...]
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;

Оконные функции могут появляться только в предложениях SELECT или ORDER BY.

Есть ли альтернативный синтаксис, чтобы избежать этого ограничения, или подзапрос - единственный разумный способ?

Конечная цель состоит в том, чтобы интегрировать этот код в больший набор динамически генерируемых выражений SQL. Если я могу сохранить один запрос, я могу просто определить различные части (выбрать, объединить таблицы, где, сгруппировать, иметь и упорядочить по) с массивами. В противном случае мне нужно подумать о переписывании.

Ответы на вопрос(2)

Ваш ответ на вопрос