sql >> Base de Datos >  >> RDS >> PostgreSQL

Seleccione una fila aleatoria de una tabla de PostgreSQL con probabilidades de fila ponderadas

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]