Выбор строк по процентам случайности - PullRequest
0 голосов
/ 18 апреля 2020

Это структура таблицы, и она содержит только эти две строки:

--------------------------
|id   | item  | priority |
--------------------------
|1    | item1 | 20       |
--------------------------
|2    | item2 | 30       |
--------------------------

Мне нужно написать запрос к таблице, чтобы получить любую из этих 2 строк или ничего в процентном отношении.

20% шанс получить item1

30% шанс получить item2

50% шанс получить ничего

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Ниже работает на MySQL, MariaDB и MS SQL Server.

SELECT id, item, priority
FROM (
  SELECT rand() * 100 as rnd
) r
INNER JOIN (
  SELECT *, (SELECT COALESCE(SUM(priority), 0) FROM my_table WHERE id < t.id) as range_start
  FROM my_table t
) mt
ON r.rnd between mt.range_start and (mt.priority + mt.range_start);

PostgreSQL
заменить rand() на random().

SQLite
заменить rand() * 100 на ABS(RANDOM() % 100).

Oracle
заменить SELECT rand() * 100 as rnd на SELECT dbms_random.value() * 100 as rnd FROM DUAL.

0 голосов
/ 18 апреля 2020

Использование MySQL -8.0 + / MariaDB-10.2 + оконных функций:

SELECT item
FROM
  (SELECT item,
          SUM(priority) OVER (
                              ORDER BY id) AS cum_prob
   FROM my_table) AS b
WHERE cum_prob >= RAND()*100
ORDER BY cum_prob
LIMIT 1

ref: fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...