我有一个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
答案 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