Sql 如何查询用户和所有其他用户之间的平均评分差异
我有一个Postgres图书评级表,其结构如下:Sql 如何查询用户和所有其他用户之间的平均评分差异,sql,algorithm,postgresql,Sql,Algorithm,Postgresql,我有一个Postgres图书评级表,其结构如下: id串行主键, userid整数不为空, bookid整数不为空, 评级整数不为空 我想提取一个给定用户的评分和每个其他用户的评分之间的平均差异,每个都单独考虑。换句话说,作为一个用户,我想知道我的评分和某个x用户的评分之间的平均差异,对于所有x。最终,我希望能够将这个平均数与给定用户和被比较用户的ID一起放入一个新的SQL表中 我与SQL过去的简单查询非常不同,我已经实现了一个在Javascript循环和SQL查询之间来回跳跃的解决方案。如果有
id串行主键,
userid整数不为空,
bookid整数不为空,
评级整数不为空
我想提取一个给定用户的评分和每个其他用户的评分之间的平均差异,每个都单独考虑。换句话说,作为一个用户,我想知道我的评分和某个x用户的评分之间的平均差异,对于所有x。最终,我希望能够将这个平均数与给定用户和被比较用户的ID一起放入一个新的SQL表中
我与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
这可以通过自联接完成
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
选择t1.userid作为当前用户,选择t2.userid作为比较用户
,平均值(abs(t1评级-t2评级))作为平均差值
来自tbl t1
加入t1.userid上的tblt2你能努力至少显示一些示例数据和预期输出吗?