Я не знаю, почему вам запрещено использовать подзапросы. Принятое решение (и ваша первоначальная попытка) включает в себя самостоятельное объединение и агрегацию, которые являются дорогостоящими задачами.
С другой стороны, если вы используете MySQL 8.0 (или другую базу данных / версию, которая поддерживает оконные функции - возможно, SQL Сервер, поскольку вы приняли решение, которое использует CROSS APPLY
), вы можете сделать это с окном avg()
и подзапросом.
select *
from (
select
BusinessEntityID,
Rate,
avg(Rate) over() AverageRate
from mytable
) t
where Rate > AverageRate
Я ожидаю, что это должно быть значительно более эффективен, чем решение для самостоятельного объединения / агрегирования в большом наборе данных: