Cela devrait faire l'affaire :
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 sous-requête Q
donne le résultat suivant :
1 50
2 85
3 100
Nous générons ensuite simplement un nombre aléatoire dans la plage [0, 100) et choisissons la première ligne qui est à ou au-delà de ce nombre (le WHERE
clause). Nous utilisons une expression de table commune (WITH
) pour s'assurer que le nombre aléatoire n'est calculé qu'une seule fois.
BTW, le SELECT SUM(percent) FROM YOUR_TABLE
vous permet d'avoir n'importe quel poids en percent
- ils n'ont pas strictement besoin d'être des pourcentages (c'est-à-dire additionnés à 100).
[SQL Violon]