假设我有一个包含如下数据的表:
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