Ниже работает на 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
.