根据机会百分比选择行

时间:2020-04-18 06:46:40

标签: mysql

这是表结构,它仅包含以下两行:

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

我必须在表上写一个查询,以获取这2行中的任何一行,或者按机会百分比获取任何内容。

20%的几率获得item1

30%的几率获得item2

50%的机会一无所获

2 个答案:

答案 0 :(得分:1)

以下内容适用于MySQLMariaDBMS 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

答案 1 :(得分:0)

使用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