我有一个平均值列表
SELECT tv.id, AVG(ut.rating) FROM user_tvshow AS ut
LEFT JOIN tvshows AS tv ON tv.id = ut.tvshow
WHERE "user" IN (
SELECT follows FROM user_follows WHERE "user" = 1 -- List of users the current user follows
) AND rating IS NOT NULL GROUP BY tv.id;
目前,它平均预期的结果。有什么方法可以加权该平均值与组中的行数吗?这样一来,评分10的一行不会出现高于评分9的100行。
答案 0 :(得分:2)
这不是加权平均值。听起来好像您正在尝试到达Bayesian average,在该位置您通过将其观察到的平均值移向某个元平均值来对一小集进行惩罚。 PostgreSQL中没有内置的方法可以做到这一点。
分别计算总和和计数,然后使用某种机制基于这些值来执行惩罚。您可以在客户端中执行此操作,也可以编写一个外部查询,该查询使用子查询的结果并应用公式。
select id, (the_sum + 10* <metaaveerage>)/(the_count+10) from (
SELECT tv.id, sum(ut.rating) as the_sum, count(ut.rating) as the_count FROM user_tvshow AS ut
LEFT JOIN tvshows AS tv ON tv.id = ut.tvshow
WHERE "user" IN (
SELECT follows FROM user_follows WHERE "user" = 1 -- List of users the current user follows
) AND rating IS NOT NULL GROUP BY tv.id
) foobar
如何确定要插入10
和<metaaverage>
的值是统计问题,而不是编程问题。