今天我发布了
a question
如果
bayesan
在我的案例中,这是一个很好的方法来做评分系统权重。由于我没有得到答案,我试图实现如果我自己。
在我的数据库中,用户可以为每个组添加1到5颗星的投票。然后,我必须根据这些选票显示排行榜。到目前为止,我一直在做的是按无权重的平均票数排序。这可不太好,因为一个拥有5.0票(20票)的群体比一个拥有4.9票(平均)和10000票的群体更早。
这是我的桌子:
CREATE TABLE IF NOT EXISTS votes(
user_id BIGINT,
group_id BIGINT,
vote SMALLINT,
vote_date timestamp,
PRIMARY KEY (user_id, group_id)
这是我试图提出的一个问题,似乎有效:
SELECT
v.group_id,
s_ref.title,
s_ref.username,
COUNT(vote) AS amount,
ROUND(AVG(vote), 1)::float AS average,
-- (WR) = (v ÷ (v+m)) à R + (m ÷ (v+m)) à C
( (COUNT(vote)::float / (COUNT(vote)+10)) * AVG(vote)::float + (10::float / (COUNT(vote)+10)) * 4 ) AS bayesan,
RANK() OVER (PARTITION BY s.lang ORDER BY( (COUNT(vote)::float / (COUNT(vote)+10)) * AVG(vote)::float + (10::float / (COUNT(vote)+10)) * 4 ) DESC)
FROM votes AS v
LEFT OUTER JOIN supergroups_ref AS s_ref
ON s_ref.group_id = v.group_id
LEFT OUTER JOIN supergroups AS s
ON s.group_id = v.group_id
GROUP BY v.group_id, s_ref.title, s_ref.username, s.nsfw, s.banned_until, s.lang, s.category, s.bot_inside
HAVING
(s.banned_until IS NULL OR s.banned_until < now())
AND COUNT(vote) >= 10
AND s.bot_inside IS TRUE;
但我只遗漏了一件事(我希望如此):查询中bayesan公式中的4只是一个伪值,因为读到这里我还不明白
what is mean with 'C'
。你能告诉我应该给c添加什么吗?