пытается сравнить среднее значение столбца с каждым значением столбца - БЕЗ ИСПОЛЬЗОВАНИЯ Nested или SubQUERY - PullRequest
2 голосов
/ 13 февраля 2020

Вот так выглядят мои данные.

image

Я хочу выяснить, у каких юридических лиц рейтинг выше среднего. В базе данных есть больше данных - это только часть их

Запрос, который я использовал:

SELECT A.BusinessEntityID, A.Rate, AVG(B.Rate) as AverageRate
FROM HumanResources.EmployeePayHistory AS A
INNER JOIN HumanResources.EmployeePayHistory AS B ON B.BusinessEntityID = A.BusinessEntityID - 1
GROUP BY A.BusinessEntityID, A.Rate
HAVING A.Rate > AVG(B.Rate)
Order By A.BusinessEntityID

Я получил этот результат

Я получаю различное среднее для каждой строки / id, но это должно быть среднее значение для всего столбца Rate и значение 1

Result

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я не знаю, почему вам запрещено использовать подзапросы. Принятое решение (и ваша первоначальная попытка) включает в себя самостоятельное объединение и агрегацию, которые являются дорогостоящими задачами.

С другой стороны, если вы используете MySQL 8.0 (или другую базу данных / версию, которая поддерживает оконные функции - возможно, SQL Сервер, поскольку вы приняли решение, которое использует CROSS APPLY), вы можете сделать это с окном avg() и подзапросом.

select *
from (
    select 
        BusinessEntityID, 
        Rate, 
        avg(Rate) over() AverageRate
    from mytable
) t
where Rate > AverageRate

Я ожидаю, что это должно быть значительно более эффективен, чем решение для самостоятельного объединения / агрегирования в большом наборе данных:

0 голосов
/ 13 февраля 2020

Вы можете использовать CROSS APPLY здесь, а затем получить среднюю ставку для всех сущностей из таблицы перекрестных применений. В основном вы меняете INNER JOIN на CROSS APPLY и удаляете условие соединения. Запрос будет выглядеть так:

SELECT
    A.BusinessEntityID
    ,A.Rate
    ,AverageRate = AVG(B.Rate)
FROM HumanResources.EmployeePayHistory AS A
CROSS APPLY HumanResources.EmployeePayHistory AS B 
GROUP BY
    A.BusinessEntityID
    ,A.Rate
HAVING A.Rate > AVG(B.Rate)
ORDER BY A.BusinessEntityID;

Как упоминалось в GMB, CROSS APPLY работает только на SQL сервере. Но CROSS JOIN также должен работать в этом запросе в MySql.

SELECT
    A.BusinessEntityID
    ,A.Rate
    ,AverageRate = AVG(B.Rate)
FROM HumanResources.EmployeePayHistory AS A
CROSS JOIN HumanResources.EmployeePayHistory AS B 
GROUP BY
    A.BusinessEntityID
    ,A.Rate
HAVING A.Rate > AVG(B.Rate)
ORDER BY A.BusinessEntityID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...