Това трябва да свърши работа:
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;
Подзаявката Q
дава следния резултат:
1 50
2 85
3 100
След това просто генерираме произволно число в диапазон [0, 100) и избираме първия ред, който е на или извън това число (WHERE
клауза). Използваме общ табличен израз (WITH
), за да се гарантира, че произволното число се изчислява само веднъж.
BTW, SELECT SUM(percent) FROM YOUR_TABLE
ви позволява да имате всякакви тегла в percent
- не е задължително те да бъдат строго проценти (т.е. добавка до 100).
[SQL Fiddle]