Извлечение предметов из БД с взвешенным шансом - PullRequest
4 голосов
/ 19 июля 2009

Допустим, у меня была таблица, полная записей, из которых я хотел получить случайные записи. Однако я хочу, чтобы определенные строки в этой таблице появлялись чаще, чем другие (и какие из них различаются в зависимости от пользователя). Как лучше всего это сделать, используя SQL?

Единственный способ, которым я могу придумать, - это создать временную таблицу, заполнить ее строками, которые я хочу чаще использовать, а затем дополнить ее другими случайно выбранными строками из таблицы. Есть ли лучший способ?

Ответы [ 3 ]

4 голосов
/ 19 июля 2009

Один из способов, который я могу придумать, - это создать в таблице еще один столбец, который представляет собой скользящую сумму ваших весов, затем вывести ваши записи, сгенерировав случайное число между 0 и суммой всех ваших весов, и потянуть строку с помощью наибольшее значение скользящей суммы меньше случайного числа.

Например, если у вас было четыре строки со следующими весами:

+---+--------+------------+
|row| weight | rollingsum |
+---+--------+------------+
| a |      3 |          3 |
| b |      3 |          6 |
| c |      4 |         10 |
| d |      1 |         11 |  
+---+--------+------------+

Затем выберите случайное число n в диапазоне от 0 до 11 включительно и верните строку a, если 0<=n<3, b, если 3<=n<6 и т. Д.

Вот несколько ссылок на генерацию скользящих сумм:

http://dev.mysql.com/tech-resources/articles/rolling_sums_in_mysql.html

http://dev.mysql.com/tech-resources/articles/rolling_sums_in_mysql_followup.html

0 голосов
/ 20 июля 2009

Начните с 3 таблиц пользователей, данных и пользовательских данных. Пользовательские данные содержат, какие строки должны быть предпочтительными для каждого пользователя.

Затем создайте одно представление на основе строк данных, которые предпочитает пользователь.

Создайте второе представление с данными без предпочтений.

Создайте третье представление, которое является объединением первых 2. Объединение должно выбрать больше строк из предпочтительных данных.

Затем, наконец, выберите случайные строки в третьем представлении.

0 голосов
/ 20 июля 2009

Я не знаю, что это можно сделать очень легко одним SQL. С T-SQL или аналогичным, вы можете написать цикл для дублирования строк или использовать SQL для генерации инструкций для выполнения дублирования строк.

Я не знаю вашу вероятностную модель, но вы могли бы использовать такой подход для достижения последней. Учитывая эти определения таблицы:

RowSource
---------
RowID

UserRowProbability
------------------
UserId
RowId
FrequencyMultiplier

Вы можете написать запрос, подобный этому (специфично для SQL Server):

SELECT TOP 100 rs.RowId, urp.FrequencyMultiplier
FROM RowSource rs
  LEFT JOIN UserRowProbability urp ON rs.RowId = urp.RowId
ORDER BY ISNULL(urp.FrequencyMultiplier, 1) DESC, NEWID()

Это позаботится о выборе случайного набора строк, а также о том, сколько должно быть повторено. Затем в логике приложения вы можете выполнить дублирование строк и перемешать результаты.

...