Avatar billede Slettet bruger
08. marts 2007 - 15:23 Der er 9 kommentarer og
2 løsninger

Data udtræk

Jeg har en points-tabel med følgende data

ID NR    Points
3167    56.95   
1247    56.75   
1114    56.29
5157    55.14   
3749    55.14   
2359    55.10   
2975    53.54   
3359    52.85   

Jeg vil gerne have et SQL udtræk af denne således at der er et nyt felt (placering) der fremkommer i udtrækket.


ID NR    Points Placering
3167    56.95    1
1247    56.75    2
1114    56.29    3
5157    55.14    4
3749    55.14    4
2359    55.10    6
2975    53.54    7
3359    52.85    8

Nogle der kan hjælpe?
Avatar billede Slettet bruger
08. marts 2007 - 15:24 #1
Bemærk desuden. Såfremt der er flere der har ens points, ender de på en delt plads. I dette tilfælde en delt 4-plads.
Avatar billede isl19960 Nybegynder
08. marts 2007 - 17:38 #2
Avatar billede Slettet bruger
08. marts 2007 - 17:59 #3
Kører en SQL server fra 2000. Den kender ikke Rank() funktionen åbenbart
Avatar billede kim_falkner Nybegynder
08. marts 2007 - 21:04 #4
hvad med noget i retning af

select a, b, (select count(*)+1 from tabel x where y < b) from tabel?

Prøv at arbejde videre med tanken

Den vil være grim jo flere rows der er i din tabel.
Avatar billede bennytordrup Nybegynder
09. marts 2007 - 08:16 #5
Du har to muligheder:

Hvis du skal bruge resultatet i klient-kode (ASP, ASP.NET, WinForms eller lignende), kan du lave en stored procedure, som returnerer et resultatsæt efter ønske. Denne stored procedure ser ud som følger:

create procedure GetRanking
as
    set nocount on

    create table #Ranking
    (
        Position    int identity(1, 1),
        ID            int,
        Points        decimal(10, 2)
    )

    insert        #Ranking (ID, Points)
    select        ID, Points
    from        Points
    order by    Points desc

    set nocount off

    select        *
    from        #Ranking
    order by    Position

    set nocount on

    drop table #Ranking



Hvis du skal bruge resultatet i en større SQL sammenhæng, så du skal kunne joine med det, er du nødt til at lave en table function. Den ser således ud:


create function fnGetRanking()
returns @ranking table
(
    Position    int identity(1, 1),
    ID            int,
    Points        decimal(10, 2)
)
as
begin
    insert        @ranking (ID, Points)
    select        ID, Points
    from        Points
    order by    Points desc

    return
end


Jeg har taget udgangspunkt i, at IDNr er int og Points er decimal(10, 2), men begge disse kan ændres efter behov.
Avatar billede bennytordrup Nybegynder
09. marts 2007 - 08:18 #6
Funktionen kan bruges i SQL som

select * form fnGetRanking()
Avatar billede Slettet bruger
09. marts 2007 - 08:30 #7
Benny -> Det ser godt ud. Har dog ikke mulighed for at teste det nu.
Men så vidt jeg kan se, tager din funktion ikke højde for at nogle fx. har en del 4-plads eller sådan, som skitseret øverst.

ID NR    Points Placering
3167    56.95    1
1247    56.75    2
1114    56.29    3
5157    55.14    4
3749    55.14    4
2359    55.10    6
2975    53.54    7
3359    52.85    8

Er klar over at det sikkert er temmelig svært at lave.
Avatar billede bennytordrup Nybegynder
09. marts 2007 - 10:03 #8
Det har du ret i.

Men hvis du har andre regler for håndtering af dette (jeg ved ikke hvordan, points udregnes), så kan dette bruges til sorteringen.
Avatar billede isl19960 Nybegynder
09. marts 2007 - 10:32 #9
okay - det er vist en 2005 funktion...

Så må du jo bare op på den ;-)

Nå, men jeg prøvede google, og den ledte mig til den her side:

http://sqlservercode.blogspot.com/2006/03/ranking-in-sql-server-2000.html

Det skal dog siges at jeg ikke har testet det skrevne overhovedet... men måske det kan hjælpe dig videre...
Avatar billede Slettet bruger
11. marts 2007 - 12:53 #10
Tak for jeres hjælp.
isl19960 -> Det var lige præcist den jeg efterspurgte. Smider du et svar?
Avatar billede isl19960 Nybegynder
11. marts 2007 - 21:55 #11
Jamen, så er der da et svar her...
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