Esto debería funcionar:
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;
La subconsulta Q
da el siguiente resultado:
1 50
2 85
3 100
Luego simplemente generamos un número aleatorio en el rango [0, 100) y elegimos la primera fila que está en o más allá de ese número (el WHERE
cláusula). Usamos una expresión de tabla común (WITH
) para garantizar que el número aleatorio se calcule solo una vez.
Por cierto, el SELECT SUM(percent) FROM YOUR_TABLE
le permite tener cualquier peso en percent
- no es necesario que sean porcentajes estrictos (es decir, que sumen 100).
[Violín SQL]