Как выбрать среднее значение GROUPED BY для неспецифического ключа в операторе SELECT - PullRequest
2 голосов
/ 31 марта 2019

Я ищу способ выбрать среднее значение для конкретного пользователя в операторе выбора, а затем вычислить дисперсию в текущей строке из ранее вычисленного среднего.

Пользователь и Attmept_Number - составной ключ,Кроме того, это должно быть сделано либо в предложении SELECT, либо WHERE.Мне известно о решении, использующем FROM (SELECT...), но в этом случае я ищу другое решение.

SELECT 
    User, 
    Attmept_Number, 
    (User_Score - AVG(User_Score)) As Variance
FROM Scores

С помощью приведенного выше утверждения я получаю среднее значение по столбцу, а не среднее значение для пользователя.Когда я добавляю предложение GROUP BY, это вызывает проблемы из-за составного ключа.

Результат:

User   Score   Variance
1      5       -6
1      10      -1
1      15      4
3      14      3

Цель:

User   Score   Variance
1      5       -5
1      10      0
1      15      5
3      14      0

1 Ответ

2 голосов
/ 31 марта 2019

С MySQL 8.0 это так же просто, как с использованием оконной функции AVG(...) OVER(...):

SELECT
   user,
   score,
   score - AVG(score) OVER(PARTITION BY user) AS variance
FROM scores

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

SELECT
   s.user,
   s.score,
   s.score - t.avg_score AS variance
FROM scores s
INNER JOIN (
    SELECT user, AVG(score) avg_score FROM scores GROUP BY user
) t ON s.user = t.user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...