PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Sélectionnez une ligne aléatoire dans une table PostgreSQL avec des probabilités de ligne pondérées

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]