10. november 2005 - 11:21Der er
19 kommentarer og 1 løsning
Get top 10?
hehe et lidt simplet spørgsmål men jeg har glemt alt for meget om SQL til at kunne huske den slags ;) så håber i kan hjælpe
vi skal danne en highscore liste med dem som har de 10 bedste points
SELECT username, point FROM playertable ORDER BY point desc;
men her for vi jo så hele listen men vi vil kun havde de 10 bedste ud ( dette blvier så lavet om til at det skal være efter brugerens ønske altså om han vil havde top 23 eller top 2000 men dette er ikke så relavant dette ordner vi i vores EJB men nu skal jeg bare havde denne forspørgsel på plads :P
ogroen forslag virker også men det er til version 8i mener jeg.
Synes godt om
Slettet bruger
10. november 2005 - 11:43#9
pgroen's forslag udnytter at Oracle bruger et internt rownum og vil fungere på alle Oracle versioner som indeholer sub-select. Så det må vist anses for at være Oracle-måden at gøre det på.
kryptos >> Min måde er den måde man benytter sig af i oracle9i.
slå det evt. op for du kender den åbenbart ikke:)
Synes godt om
Slettet bruger
10. november 2005 - 11:47#11
Det er jo bare syntax, der hvor jeg ville hen var bare at pgroen's forslag vil fungerer helt ned til version 7 om man skulle være så uheldig at være udsat for den slags ;)
Pas nu på med rownum! Jeg har ofte haft kunder der er løbet ind i problemer med netop "ROWNUM". Den skal bruges med forsigtighed, da man risikere at ikke alle data tages i betragning i selecten - hvis where clauses placeres forkert. Sql'en vil simpelthen springe ud af dens interne select, når den har fundet og behandlet de første 10 rækker.
Syntaxen er som pgroen også skriver:
SELECT [column_list], ROWNUM FROM (SELECT [column_list] FROM table ORDER BY Top-N_column) WHERE ROWNUM <= N;
Eksempel på hvordan det kan gå galt: SQL> select empno, ename, sal from emp where rownum <=10 order by sal desc;
Denne springer ud af løkken når der er fundet 10 rækker.
SQL> select empno, ename, sal from (select empno, ename, sal from emp order by sal desc) where rownum <=10; Denne gør det rigtigt og finder først alle rækker, hvorefter den trækker de 10 ud som i ønsker.
hehe kalp, din løsning fungerede som sagt godt nok i sql men vi fandt en lille fejl ved den ;) hvis der var f.eks 15 brugere og f.eks 9-12 havde samme antal point viste den dem alle sammen altså det blev en top 12 frem for top 10 :P
men løste det ved at smide and rownum <= 10; ind efter resten dog virker det nu som lidt doubelt arbejde
drop view playerranktop10; create view playerranktop10 as SELECT username, point FROM (SELECT username, point, RANK() OVER (ORDER BY point desc) pl FROM playertable) WHERE pl <= 10 and rownum <= 10;
men den rownum tager vel kun ud fra de 12 der så måske er tilbage right eller køre den det hele igennem igen for så er der jo ikke rigtig grund til at bruge den methode du forslog.
Synes godt om
Slettet bruger
11. november 2005 - 13:13#16
Som pgroen skrev for længe siden:
SELECT * FROM (SELECT username, point FROM playertable ORDER BY point DESC) WHERE ROWNUM <= 10;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.