Isso deve fazer o truque:
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;
A subconsulta
Q
dá o seguinte resultado:1 50
2 85
3 100
Em seguida, simplesmente geramos um número aleatório no intervalo [0, 100) e escolhemos a primeira linha que está nesse número ou além (o
WHERE
cláusula). Usamos a expressão de tabela comum (WITH
) para garantir que o número aleatório seja calculado apenas uma vez. BTW, o
SELECT SUM(percent) FROM YOUR_TABLE
permite que você tenha qualquer peso em percent
- eles não precisam ser estritamente porcentagens (ou seja, somar 100). [Fiddle SQL]