Выберите случайные строки из таблицы Postgres, взвешенные по значению в столбце

#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