SQL中针对所有其他行计算一组行的有效方法?

时间:2018-10-06 17:00:25

标签: 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 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的值,以便在计算中跳过一个。

1 个答案:

答案 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