Эффективный способ в SQL для вычисления набора строк со всеми другими строками? - PullRequest
0 голосов
/ 06 октября 2018

Допустим, у меня есть таблица с данными, которая выглядит следующим образом:

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, но я попытался упростить набор данных для этого вопроса.

Кроме того, обратите внимание, что не все пользователи имеют рекламную ценность, поэтому она должна толькофактор соответствия наборов.Посмотрите, как в приведенном выше примере у пользователя 4 нет значения для d = 3, поэтому он пропускается при расчете.

1 Ответ

0 голосов
/ 06 октября 2018

Объединение и агрегация должны работать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...