Avatar billede charly Nybegynder
23. januar 2004 - 13:05 Der er 5 kommentarer og
1 løsning

tre vilkårlige rækker

Hvordan ser et sql kald ud, hvis man vil ha tre tilfældige rækker fra en MS SQL db.

Jeg har kun starten af løsningen, hvem har resten? :-)

SELECT TOP 3 FROM DB WHERE...
Avatar billede trer Nybegynder
23. januar 2004 - 13:18 #1
Der er reelt set ikke noget der hedder tre tilfældige rækker i en database. Ideen i en relationel database er man man entydigt kan identificere en given række.

Hvis du har en tal-kolonne med unikke værdier - fx id - så kan du bruge en random funktionen til at vælge nogle rækker ud.
Avatar billede charly Nybegynder
23. januar 2004 - 13:26 #2
Enig i din definition!

Har du et syntax eksempel på sådan et random kald?
Avatar billede trer Nybegynder
23. januar 2004 - 13:37 #3
Funktionen hedder RAND()  - den fungerer ligesom C's random funktion.  Du kan angive et random seed i parentesen hvis du ser fordel i det (fx fra GetDate() milisekund-værdi)

Måske noget i denne stil

select *
from mytable
where id between 1 and floor(rand()*1000)
order by id desc

Bemærk at højeste række der kan vælges i ovenstående er 1000 - og de tre rækker der vælges er blot de tre med højste id værdier.

En anden mulighed er, at du laver tre eller flere udtræk med id = rand() og samler dem med en UNION
a la

select top 3 * from (
select * from mytable where id = floor(rand()*1999)
union
select * from mytable where id = floor(rand()*1999)
union
select * from mytable where id = floor(rand()*1999)
union
select * from mytable where id = floor(rand()*1999)
union
select * from mytable where id = floor(rand()*1999)
) as x

grunden til at jeg trækker flere end 3 rækker ud er, at RAND() nemt kan levere en værdi der ikke indgår i din nøglerække...
Avatar billede charly Nybegynder
23. januar 2004 - 13:41 #4
Smukt. Tak for det.
Avatar billede cbp Nybegynder
23. januar 2004 - 14:28 #5
Hvis man rand() i en select bliver den kun udført en gang og dermed vil alle rows få samme tilfældige værdi. Et lille trick kunne være at bruge newis() som giver en ny guid:
select top 3 *
from mytable
order by newid()
Avatar billede charly Nybegynder
23. januar 2004 - 18:05 #6
cbp: Tak for tippet. Har også lige forsøgt mig med dit eksempel. Det virker også perfekt og enkelt at implementere!
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