Avatar billede aiuradun Nybegynder
10. november 2005 - 11:21 Der 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

på forhånd tak for hjælpen.
Avatar billede pgroen Nybegynder
10. november 2005 - 11:23 #1
SELECT *
  FROM (SELECT  username, point
            FROM playertable
        ORDER BY point DESC)
WHERE ROWNUM <= 10;
Avatar billede dr_chaos Nybegynder
10. november 2005 - 11:23 #2
SELECT TOP 10  point,username
FROM playertable
ORDER BY point desc;
Avatar billede kalp Novice
10. november 2005 - 11:24 #3
hej anders
Avatar billede kalp Novice
10. november 2005 - 11:25 #4
hehe
Avatar billede kalp Novice
10. november 2005 - 11:30 #5
SELECT TOP 10 blah blah.. virker fint... men det er ikke standard SQL.
Avatar billede aiuradun Nybegynder
10. november 2005 - 11:33 #6
hejsa bilal hvad så :) køre det i jeres gruppe :P

og tak for svarne utroligt hvor dårligt man husker en gang i mellem.
Avatar billede kalp Novice
10. november 2005 - 11:34 #7
Hvis jeg har lavet denne rigtigt så er det den du skal anvende eftersom det er til Oracle 9i og det er den version du anvender.

SELECT username, point
FROM (SELECT username, point, RANK() OVER (ORDER BY point desc) pl FROM playertable) WHERE pl <= 10;
Avatar billede kalp Novice
10. november 2005 - 11:35 #8
ogroen forslag virker også men det er til version 8i mener jeg.
Avatar billede 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å.
Avatar billede kalp Novice
10. november 2005 - 11:44 #10
kryptos >> Min måde er den måde man benytter sig af i oracle9i.

slå det evt. op for du kender den åbenbart ikke:)
Avatar billede 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 ;)
Avatar billede kalp Novice
10. november 2005 - 11:48 #12
ahh på den måde:) okay... mit er kun til 9i, men ved som sagt det er den database version aiuradun arbejder med:)
Avatar billede aiuradun Nybegynder
10. november 2005 - 13:21 #13
oki kan godt få kalp's forslag til at virke i den normale orcale.

men at få den over til EJB-QL det virker lidt svært og uover skueligt det kunne jeg godt bruge en hjælpene hånd til
Avatar billede pnielsen Nybegynder
11. november 2005 - 07:47 #14
Bare en lille advarsel...

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.

Held og lykke med jeres project.
Avatar billede aiuradun Nybegynder
11. november 2005 - 13:07 #15
jo tak ;)

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.
Avatar billede 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;


Det må anses for den billigste til det problem.
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 16:44 #17
Du mangler at lukke spørgsmålet.
Avatar billede pgroen Nybegynder
14. marts 2006 - 12:35 #18
Halloooo - Du mangler at lukke spørgsmålet.
Avatar billede aiuradun Nybegynder
03. maj 2006 - 14:56 #19
kan ikke lige finde noget sted hvor man kan lukke spørgsmålet men har da givet dig point hvis det var det du var ude efter.
Avatar billede dr_chaos Nybegynder
03. maj 2006 - 15:06 #20
det er lukket når du har accepteret svaret.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester