sql >> Database >  >> RDS >> PostgreSQL

Selecteer een willekeurige rij uit een PostgreSQL-tabel met gewogen rijkansen

Dit zou moeten werken:

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;

De subquery Q geeft het volgende resultaat:

1  50
2  85
3  100

We genereren dan eenvoudig een willekeurig getal in het bereik [0, 100) en kiezen de eerste rij die op of buiten dat getal ligt (de WHERE clausule). We gebruiken gemeenschappelijke tabeluitdrukkingen (WITH ) om ervoor te zorgen dat het willekeurige getal slechts één keer wordt berekend.

BTW, de SELECT SUM(percent) FROM YOUR_TABLE stelt u in staat om gewichten in percent te gebruiken - het hoeven niet strikt percentages te zijn (d.w.z. opgeteld tot 100).

[SQL Fiddle]



  1. Moet alle triggers in de SQL Server-database vermelden met tabelnaam en tabelschema

  2. Hoe schakel ik MSDTC in op SQL Server?

  3. if (selecteer count(column) from table)> 0 then

  4. Hoe het SQL-queryresultaat naar PANDAS-gegevensstructuur te converteren?