如何查询用户与所有其他用户之间的平均评分差异

时间:2017-12-07 00:44:43

标签: sql algorithm postgresql

我有一个Postgres图书评级表,其结构如下:

id serial primary key, userid integer not null, bookid integer not null, rating integer not null

我想提取给定用户评分和每个其他用户评分之间的平均差异,每个评分都单独考虑。换句话说,作为一个用户,我想知道我的评级和一些x用户评级之间的平均差异,对于所有x。最后,我希望能够将这个平均数字放在一个新的SQL表中,并与给定用户和被比较用户的ids一起放置。

我对SQL过去的简单查询非常不熟悉,而且我已经实现了一个在Javascript循环和SQL查询之间来回跳舞的解决方案。如果有人愿意提供帮助,我正在寻找尽可能干净的东西。

编辑:这是数据和理想输出的简短示例。

id,userid,bookid,rating

1,1,1,5
2,1,2,2
3,1,3,3
4,1,4,3
5,1,5,1
6,2,1,5
7,2,2,2
8,3,1,1
9,3,2,5
10,3,3,3

这是理想的输出,结构为另一个sql表:

id serial primary key,
currentuser integer not null,
compareuser integer not null,
averagediff float not null

id,currentuser,compareuser,averagediff

1,1,2,0
2,1,3,2.33333

1 个答案:

答案 0 :(得分:1)

这可以通过自我加入来完成。

select t1.userid as current_user,t2.userid as compare_user
,avg(abs(t1.rating-t2.rating)) as average_difference
from tbl t1
join tbl t2 on t1.userid<t2.userid and t1.bookid=t2.bookid
group by t1.userid,t2.userid