Véletlenszerű kiválasztás adatbázisból súlyozással

Adott egy adathalom egy adatbázisban, amihez minden eleméhez hozzá van rendelve egy súly (1..10). E közül kellene véletlenszerűen kiválasztani elemeket a súlyozást figyelembe véve.

Szerintetek mi a legjobb módszer a rendezésre?

Alapvetően egy ORDER BY rész vagy egy képlet kellene amiben kettő változó van (súly, véletlen szám), ami alapján rendezni lehetne az elemeket.

Hozzászólások

Hajdan kellett hasonlót csinálnom postgressel.
A főtáblához adtam egy új táblát, amely csak a főtábla kulcsát tartalmazta. Az új táblába minden kulcsot annyiszor szúrtam be, amennyit a súly mutatott.
Aztán
random szám, ahol a maximum az új tábla count(*)-ja, ez lesz a (r)oid.

Végül

select * from ujtabla, fotabla where ujtabla.oid=roid and fotabla.kulcs = ujtabla.kulcs

Persze ehhez az kellett, hogy a fotabla se es a maximalis suly se legyen "tul" nagy.

Igen, jelenleg nekem is így van (csak nem ideiglenes táblában, hanem tárolt eljárás generálja, de ezt ideiglenes megoldásnak szántam, hogy haladni tudjunk), csak az a probléma, hogy túl sok az adat ahhoz, hogy hosszútávon optimális legyen.

Jelenleg kb. 5000 * 100-200 elemre számítok, átlag súlyértéknél meg 6-ra. Ez durva becsléssel is 4,5M rekordot jelentene, ami azért elég sok. Persze, egyidőben mindig kb. 1000 elem lenne az érdekes ebből.

(Alapszitu az, hogy van egy cache táblám arról, hogy két objektum kapcsolatban áll egymással és ez súlyozva van).

----------------
Lvl86 Troll

Nah, arra jutottunk még, hogy egy működőképes verziónak tűnik az, hogy generálunk egy számot 1..10 között, és csak azokat az elemeket fogjuk véletlenszerűen lekérdezni, aminek a súlya >= ennél a véletlen értéknek.

Egy hátránya, hogy nem veszi figyelembe azt, hogy a súlyok átlaga nem feltétlen 5, így némileg torzulhat az eredmény, viszont nem kell annyi ideiglenes adattal dolgozni és nem kell utólag a duplikációkat szűrni (kétszer kellene RANDOM() alapján rendezni, mert a DISTINCT magával von egy ORDER BY -t is).

Szerk: Másik problémája, hogy ha nagyobbat generál, mint a maximális súly, akkor nem ad vissza semmit, de ezt nem nehéz orvosolni.

----------------
Lvl86 Troll

Nagyobbat, mint a táblában jelenlevő aktuális súlymaximum?
Kérdezd le, és annyi legyen a random maximuma. Ha jók az indexek, akkor index scan megadja.

Súlyátlagot meg néha generálhatnál, pl naponta éjjel(ez jól kijött :D), és ezt veszed alapul.

--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.