Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中根据所有其他行计算一组行的有效方法?_Sql_Database_Postgresql_Matrix - Fatal编程技术网

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。如果你不想,你不必编辑你的答案。我要试着考虑一下。再次感谢!