Я разрабатываю новый веб-сайт, на котором есть некоторые "субъекты" для голосования.
Каждый голос может быть числом от 1 до 5, где 1 является самым худшим, а 5 - лучшим.
Теперь, на том же веб-сайте, у меня есть "диаграмма популярных организаций", где я перечисляю наиболее популярные "сущности" на основе их голосования.
Теперь я не могу сделать просто среднее арифметическое, потому что "сущность" с одним голосом 5 может иметь такое же ранжирование, как "сущность" со 100 голосами 5.
Я думал о сохранении для каждой "сущности" не только среднего арифметического, но и количества голосов и выполнения SQL-запроса, где я заказываю по количеству голосов и среднему арифметическому, но кажется, что после этого сущность со многими голосами 1 может получить популярность (если это не популярно).
Какой алгоритм я могу использовать?
Для базового решения попробуйте order by [average vote] desc, [vote count] desc
этот путь из двух сущностей с таким же средним значением, один со 100 голосами будет превышать один с 1 голосом, но один со средним значением 4,5 будет никогда не переходите выше среднего со средним значением 5.
Редактировать 1
Если вы хотите, чтобы 100 голосов в среднем составляли 4,5, чтобы выиграть против 10 голосов в среднем 5, почему бы не подсчитать голоса, игнорируя 1, 2 и 3, или [подсчет голосов 4 и 5] - [подсчет голосов 1 и 2]? Таким образом, количество положительных голосов поднимет сущности в рейтинге.
Изменить 2
Возможно, вы захотите придать особое значение последним голосам. Возможно, что-то изменилось в отношении лица, которое изменило мнение пользователя об этом. Можно было бы создать еще одно среднее голосов за прошлый месяц и скорректировать окончательные ряды на его основе.
Редактировать 3
Как насчет того, чтобы вычислить столбец [popularScore] и просто заказать?
-- sum instead of average
-- square root of sum will reduce importance of vote count a bit
select
entity,
sqrt(sum(vote - 3)) as popularityScore
from Votes
group by entity
order by rank desc
-- 50 votes of 5 -> popularityScore = 12.25
-- 100 votes of 4 -> popularityScore = 10
-- 200 votes of 4 -> popularityScore = 14.14
-- 2000 votes of 4 -> popularityScore = 44.72
-- 2000 votes of 5 -> popularityScore = 63.25
-- 100000000 votes of 3 -> popularityScore = 0
Можно рассчитать ту же самую оценку за последний месяц и добавить ее к этому значению.