sql >> Databasteknik >  >> RDS >> PostgreSQL

Välj slumpmässig rad från en PostgreSQL-tabell med viktade radsannolikheter

Detta borde göra susen:

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;

Underfrågan Q ger följande resultat:

1  50
2  85
3  100

Vi genererar sedan helt enkelt ett slumpmässigt tal i intervallet [0, 100) och väljer den första raden som är vid eller bortom det numret (VAR klausul). Vi använder vanligt tabelluttryck (WITH ) för att säkerställa att slumptalet endast beräknas en gång.

BTW, VÄLJ SUMMA(procent) FRÅN DIN_TABELL låter dig ha valfri vikt i procent - de behöver strikt inte vara procentsatser (d.v.s. lägga till 100).

[SQL-fiol]



  1. Grundläggande tabelluttryck, del 9 – vyer, jämfört med härledda tabeller och CTE

  2. JSON_VALUE() i MySQL

  3. JSON_REPLACE() – Ersätt värden i ett JSON-dokument i MySQL

  4. Hur automatiska uppdateringar av statistik kan påverka frågeprestanda