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

标签 mysql sql

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

User 和 Attmept_Number 是一个复合键。此外,这应该在 SELECTWHERE 子句中完成。我知道使用 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

最佳答案

使用 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

关于mysql - 如何在 SELECT 语句中为非特定键选择 GROUPED BY 平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55436786/

相关文章:

Mac OS X 上的 PHP 和 MySQL : Access denied for GUI user

libmysql.dll 中的 C++ MySQL 错误

php - IF THEN 在 mySQL 查询中

php - 使用 MySQL 在一个查询中获取关注者和关注

sql - 嵌套查询 SQL

MYSQL - 从表 1 中进行计数和分组并从表 2 中获取信息

c# - EF映射一对一可选

php - 使用 jquery/php/ajax 从 mysql 检索结果

java - 准备好的语句作为sql参数

sql - 在 MDX 语句中使用 .CHILDREN 和 .ALLMEMBERS 时的结果差异