Tohle by mělo stačit:
WITH CTE AS (
SELECT random() * (SELECT SUM(percent) FROM YOUR_TABLE) R
)
SELECT *
FROM (
SELECT id, SUM(percent) OVER (ORDER BY id) S, R
FROM YOUR_TABLE CROSS JOIN CTE
) Q
WHERE S >= R
ORDER BY id
LIMIT 1;
Dílčí dotaz Q
dává následující výsledek:
1 50
2 85
3 100
Poté jednoduše vygenerujeme náhodné číslo v rozsahu [0, 100) a vybereme první řádek, který je na tomto čísle nebo za ním (WHERE
doložka). Používáme společný tabulkový výraz (WITH
), aby bylo zajištěno, že náhodné číslo bude vypočítáno pouze jednou.
Mimochodem, SELECT SUM(percent) FROM YOUR_TABLE
umožňuje mít libovolné váhy v percent
– nemusí se nutně jednat o procenta (tj. součet do 100).
[SQL Fiddle]