我正在寻找一种方法,用于在select语句中选择特定用户的平均值,然后根据先前计算的平均值计算当前行中的方差。
User和Attmept_Number是一个复合键。另外,这应该在SELECT
或WHERE
子句中完成。我知道使用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
答案 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