RSQLite 在查询中对函数使用 group-by

RSQLite using group-by for functions within the query

我是 SQL 的新手(目前在 R 中使用 RSQLite 和 DBI 包)

我正在尝试创建一个列,它是绝对平均偏差,又名:

(i) - AVG(i,g)

其中 i 是个体出现次数,AVG 分量是组的平均值。我遇到的麻烦是确保 AVG 组件是唯一被分组的部分。当我执行 GROUP BY 时,它会将所有内容分组,但没有给我正确的数字。

示例数据如下:

student class grade
A English 79
A Spanish 65
A Chemistry 92
B English 46
B Spanish 83
B Chemistry 78
C English 67
C Spanish 87
C Chemistry 98
D English 99
D Spanish 80
D Chemistry 75

基本上我希望 class 中学生的个人成绩与该学生的平均成绩进行比较(例如,个人英语成绩 - 学生的总平均成绩)

我试过以下方法:

dbGetQuery(gradesdb, "SELECT student, 
                      ABS(grade-AVG(grade)) AS mad
                      FROM grades
                      GROUP BY student,class")

这为我提供了所有统计值的 0(我收集到的是因为分组依据正在进行查询中的所有选定操作)

我怎样才能使计算的 AVG 部分仅由学生“分组”。 如果我这样做,我会得到正确的计算:

dbGetQuery(gradesdb2, "SELECT student, 
                      ABS(grade-AVG(grade)) AS mad
                      FROM grades
                      GROUP BY student")

但是我只得到每个学生的第一个 class,而不是每个 class 的统计数据和学生的平均水平。

我想在 SQL 中完成这一切,而不是将平均值计算为具有基数 R 或 tidyverse 的单独列。

非常感谢您的帮助!

考虑通过 GROUPBYAVG() 转变为 AVG() 通过 window function:

SELECT student, 
       ABS(grade - AVG(grade) OVER (PARTITION BY student)) AS mad
FROM grades