SQL中根据所有其他行计算一组行的有效方法?
假设我有一个包含如下数据的表:SQL中根据所有其他行计算一组行的有效方法?,sql,database,postgresql,matrix,Sql,Database,Postgresql,Matrix,假设我有一个包含如下数据的表: 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 doe
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
选择
t2.user,作为计算的平均值(t1.val-t2.val)
从我的表t1
在t1.d=t2.d和t1.user t2.user上连接my_表t2
其中t1.user=2
按t2.user分组
很酷,谢谢!现在我要试着让它适应我的目的,但它看起来90%都在那里。好的,这很好,几乎完美。剩下的唯一问题是,如果两个用户不共享任何d,我希望它返回-1。如果你不想,你不必编辑你的答案。我要试着考虑一下。再次感谢!