假设我有一个表,其中的数据如下所示:
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的值,以便在计算中跳过一个。
答案 0 :(得分:2)
联接和聚合应该起作用:
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