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.
- 1644 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
normalizáld a súlyokat: ne a súllyal szorozz, előtte oszd le az összes súly legnagyobb közös osztójával
update: pár millió sor azért nem annyira sok
--
The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
ez jó, de lehet torzítatlanná tenni: veszed a súlyokat, és interpolálsz rá egy eloszlásfüggvényt, és azzal választasz véletlenszámot
--
The Net is indeed vast and infinite...
http://gablog.eu
- A hozzászóláshoz be kell jelentkezni