#postgresql #random
Вопрос:
Пользователям предоставляются 2 случайных элемента из assets
таблицы для голосования.
В votes_count
таблице есть assets
столбец, который учитывает каждый раз, когда пользователи голосуют.
При выборе 2 случайных предметов я бы хотел взвесить это больше в сторону более низкого значения votes_count
. Таким образом, пункты с меньшим количеством голосов имеют более высокую вероятность быть выбранными случайным образом.
Как я могу сделать это с помощью Postgres?
Я использовал различные методы для выбора случайных записей ( RAND()
, TABLESAMPLE BERNOULLI()
, TABLESAMPLE SYSTEM()
), но они не имеют того веса, который мне нужен.
Я запускаю PostgreSQL 13, FWIW.
Ответ №1:
Я предлагаю вам следующий запрос :
SELECT * FROM assets ORDER BY random()/power(votes_count,1) DESC LIMIT 2
Он случайным образом упорядочивает строки вашей таблицы, разделяя их на количество голосов.Это ставит более низкие голоса в более выгодное положение, чем более высокие голоса в порядке убывания. Замена степени 1 любым действительным числом n увеличит вероятность выбора меньших голосов при n gt; 1 и уменьшит вероятность выбора меньших голосов при 0 gt;lt; n