Avatar billede ircnoob Nybegynder
17. december 2007 - 14:11 Der er 9 kommentarer og
1 løsning

Rangering med inkrementel tal

Hej,
jeg har en select statement, der returnerer en række data. Hvordan kan jeg få en rangerings kolonne tilføjet, så der herunder står: 1,2,3 osv.. ?
Avatar billede wagner Nybegynder
17. december 2007 - 22:06 #1
Hvis du bruger SQL 2005 kan du bruge funktionen Identity().

Du kan læse mere om den her. http://msdn2.microsoft.com/en-us/library/ms189838.aspx

Wagner
Avatar billede hrc Mester
17. december 2007 - 22:22 #2
Det kan du også gøre i SQL 2000'eren!
Avatar billede arne_v Ekspert
18. december 2007 - 02:11 #3
Som jeg læser spørgsmålet er det nu snarere ROW_NUMBER() OVER (...) der skal bruges
jævnfør http://msdn2.microsoft.com/en-us/library/ms186734.aspx.

Men i 95% af tilfældene kan man bare lade sin applikation tilføje det nummer
uden at involvere databasen.
Avatar billede hrc Mester
18. december 2007 - 09:21 #4
... nu er det ikke mig der spørger, men jeg læser beskrivelsen og fatter ikke hvad "ROW_NUMBER() OVER" gør. Det samme gælder fætrene RANK og DENSE RANK.

Hvad er en "partition" i SQL-2005 sammenhæng?
Avatar billede hrc Mester
18. december 2007 - 09:43 #5
Fandt dog dette link som demonstrerer de forskellige rangeringsfunktioner:

  http://msdn2.microsoft.com/en-us/library/ms189798.aspx

Det hjælper lidt på forståelsen, men jeg mangler stadig at se hvor jeg kan bruge det henne. Det kommer nok.
Avatar billede arne_v Ekspert
18. december 2007 - 15:20 #6
Proev og lav:

SELECT * FROM tabel ORDER BY felt

og

SELECT ROW_NUMBER() OVER (ORDER BY felt),* FROM tabel ORDER BY felt
Avatar billede hrc Mester
19. december 2007 - 14:12 #7
Hvad er meningen med "OVER (ORDER BY felt) når der allerede er en? Det er den partitions-tingest der forvirrer mig.
Avatar billede arne_v Ekspert
19. december 2007 - 15:13 #8
Jeg har kun laest manualen, saa jeg ved ikke mere end dig.

Men det maa jo betyde at man kan faa dem ud sorteret efter en ting og faa et raekke nummer
efter en anden sortering.

Men virker det er det vel et mindre vigtigt om syntaxen er lidt mystisk.
Avatar billede arne_v Ekspert
21. januar 2008 - 04:35 #9
ircnoob ?
Avatar billede HenrikSjang Nybegynder
07. marts 2008 - 23:49 #10
PARTITION BY kan tilføjes som en slags "ekstra feature". Hvis du fx har en ordre-tabel, hvor kundenr=1 har 4 ordrer, og kundenr=2 har 5 ordrer, så kan du via den "almindelige" ROW_NUMBER() OVER(ORDER BY KundrNr) få tilføjet en kolonne i din select, som har tallene 1-9.
Hvis du tilføjer PARTITION BY, så den hedder:
ROW_NUMBER OVER(PARTITION BY KundeNr ORDER BY KundeNr)

Så "nulstiller", den tælleren når den kommer til et nyt kundenr - den partitionerer altså resultatet. Dvs., at den ekstra kolonne du selecter ud, vil bestå af tallene 1-4 for de rækker der hører til kundenr=1, og tallene 1-5 for de rækker der hører til kundenr=2.

ORDER BY tingen i forbindelse med ROW_NUMBER, angiver sådan set bare hvilken række der får row_number værdien 1, og hvilken der får 2 osv. Lige som du normalt kan selecte fra en tabel, og lave forskellige sorteringer både asc og desc, så kan du lave samme sorteringer i row_number, og så smider den så bare et fortløbende nummer på.

Ved ikke helt om det overhovedet giver mening det jeg fik skrevet... tror jeg vil i seng nu ;)
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