如何在SELECT语句中为非特定键选择GROUPED BY平均值

时间:2019-03-31 00:16:56

标签: mysql sql

我正在寻找一种方法,用于在select语句中选择特定用户的平均值,然后根据先前计算的平均值计算当前行中的方差。

User和Attmept_Number是一个复合键。另外,这应该在SELECTWHERE子句中完成。我知道使用FROM (SELECT...)的解决方案,但是在这种情况下,我正在寻找其他解决方案。

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

使用上面的语句,我得到的是列的平均值,而不是用户的平均值。当我添加GROUP BY子句时,由于Composite键而导致问题。

结果:

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 个答案:

答案 0 :(得分:2)

对于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