PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Selecionar linha aleatória de uma tabela PostgreSQL com probabilidades de linha ponderadas


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]