假设我有一个包含如下数据的表:

d   user     val
1   1        .94
1   2       -.88
1   3        .24
1   4        .74
2   1        .35
2   2        .68
2   3       -.98
2   4        .62
3   1       -.81
3   2        .97
3   3        .29
3   4        ___ (this row doesn't exist in the database)
4   1        .76
4   2        .38
4   3       -.98
4   4        .15
5   1        .69
5   2        .27
5   3       -.49
5   4       -.59

对于给定的用户(假设为2),我希望得到以下输出:
user    calc
1       -.102
3       .668
4       -.1175

通用:
user    calc
1       ((-.88 - .94) + (.68 - .35)  + (.97 - -.81) + (.38 - .76)  + (.27 - .69))  / 5
3       ((-.88 - .24) + (.68 - -.98) + (.97 - .29)  + (.38 - -.98) + (.27 - -.49)) / 5
4       ((-.88 - .74) + (.68 - .62)                 + (.38 - .15)  + (.27 - -.59)) / 4

进一步概括:
user    calc
1       sum of (user2's d value - user1's d value) / count
3       sum of (user2's d value - user3's d value) / count
4       sum of (user2's d value - user4's d value) / count

为了进一步解释,我想获得一个输出,显示每个人与给定用户(在本例中是用户2)的关系。在我的实际数据集中,有数百个未排序的不同用户和d值,但我试图为这个问题简化数据集。
另外,请注意并非所有用户都有d值,因此它应该只考虑匹配集。请参见上面的示例中,用户4没有d=3的值,因此在计算中跳过了一个值。

最佳答案

联接和聚合应该工作:

select
    t2.user, avg(t1.val - t2.val) as calc
  from my_table t1
  join my_table t2 on t1.d = t2.d and t1.user <> t2.user
  where t1.user = 2
  group by t2.user

10-05 23:11
查看更多