Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Slumpa i recordset

Postades av 2005-09-26 18:44:22 - Rasmus Ågren, i forum databaser, Tråden har 10 Kommentarer och lästs av 1136 personer

Hej!
Jag har en databas med ett par tusen poster där jag först vill välja t.ex. de största 30% och sen slumpmässigt ta fram ett av de värdena. Nu gör jag det genom att hämta hela recordsetet och sen använda move till en slumpmässig position. Det här görs 50000 gånger och får inte ta mer än kanske 10 s. Jag behöver hjälp för att snabba upp det! Finns det något sätt att antingen hämta just ett värde eller för att hämta recordsetet slumpat så att jag kan använda moveNext?


Svara

Sv: Slumpa i recordset

Postades av 2005-09-26 18:52:13 - Rasmus Ågren

Nu har jag gjort så att den bara hämtar recordsetet en gång, men den måste fortfarande hoppa runt en väldig massa och det tar för lång tid. Jag kan inget om det här men jag har deklarerat recordsetet som ADODB. Dessutom så kan jag inte gå till en viss position med Move utan måste använda moveFirst först. Så skall det väl inte vara? Tacksam för all hjälp!


Svara

Sv:Slumpa i recordset

Postades av 2005-09-26 19:08:57 - Per Hultqvist

Låt säga att du har en identity-kolumn (SQL server) eller AutoNumber (access) (lägg till en om du inte har det) och att du aldrig raderar poster från tabellen, då skulle du kunna göra så här :

SELECT * FROM [Tabell] WHERE [ID]=
    CAST(RAND()*(SELECT COUNT([ID]) FROM [Tabell]) AS INT) 

Om du raderar poster från tabellen så får du ju "hål" i identitykolumnen och då bli det inte lika enkelt längre. Då kan du i en SP loopa tills du får en träff :
DECLARE @Max int
DECLARE @Min int
DECLARE @Done bit
DECLARE @Rnd int
SET @Done=0
WHILE @Done<>1
	BEGIN
		SELECT @Max=MAX([ID]) FROM [Tabell]
		SELECT @Min=MIN([ID]) FROM [Tabell]
		SET @Rnd=CAST(RAND()*@Max AS INT)+@Min
		IF EXISTS(SELECT * FROM [Tabell] WHERE [ID]=@Rnd)
		BEGIN
			SET @Done=1		
			SELECT * FROM [Tabell] WHERE [ID]=@Rnd
		END
	END
GO


Ps. Byt ut [ID] mot din identity-kolumns namn och [Tabell] mot tabellnamnet.


Svara

Sv: Slumpa i recordset

Postades av 2005-09-26 19:36:07 - Rasmus Ågren

Tack så mycket för hjälpen, det är på ställen som sådana här som mänskligheten visar sin bästa sida! Tyvärr så förstår jag inte riktigt hur jag skall göra. Jag har en kolumn med id-nummer som går från typ 9000 till 12000. Är det det du menar? Jag kommer inte att ta bort några värden. Jag har en Access-databas. Det vore väldigt snällt om någon kunde visa hur jag skulle skriva för att välja ut ett slumptal ur de 30 högsta procenten! De skall sorteras utifrån fältet "typ" och id-fältet heter "id". Tack på förhand!


Svara

Sv:Slumpa i recordset

Postades av 2005-09-26 19:40:29 - Rasmus Ågren

Förresten, är det rimligt hinna göra 50000 kollar på 10 sekunder? Om det inte alls är det så kanske det inte är värt.


Svara

Sv: Slumpa i recordset

Postades av 2005-09-26 21:23:20 - Johan Djupmarker

Det är alltså ca 3000 poster du ska slumpa fram 50000 från? (samma post hämtas flera gånger alltså) Detta gör man nog snabbast på det sättet du gör (hur lång tid tar det?), annars skulle det gå åt 50000 anrop till databasen, det klarar du inte på 10 s.

/Johan


Svara

Sv:Slumpa i recordset

Postades av 2005-09-26 21:45:23 - Rasmus Ågren

Jag har kommit fram till att det nog tar för lång tid med databasen. Som det är nu så tar det flera minuter (vilket jag tycker verkar lite suspekt!). Nu blir väl detta lite off-topic men jag hoppas att det är ok. Hur tycker ni att jag skall lösa det hela? Finns det någon datastruktur i VB som är väldigt snabb? Jag vill alltså lägga in ett par 1000 värdepar och sortera dem. Sedan vill jag välja ut en slumpmässig post.


Svara

Sv: Slumpa i recordset

Postades av 2005-09-27 08:09:00 - Johan Djupmarker

Kan du inte lägga in talen i en Array och sedan sortera med någon sorteringsalgoritm (borde finnas massor om man googlar lite)?

/Johan


Svara

Sv: Slumpa i recordset

Postades av 2005-09-27 12:19:39 - Jan Bulér

Är du säker på att det är själva move-instruktionen på recordsetet som tar tid och inte något i din behandling av respektive post i recordsetet.

Jag gjorde en liten test i VB enligt nedan, har inte klockat den exakt men det tar ca 1 sekund att köra på min laptop men jag har kanske missat något i frågeställningen.

<code>
Const ANTAL_SLUMPADE = 50000
Dim rs As ADODB.Recordset
Dim i As Long
Dim temp As Integer

Randomize

'initiera recordset som föreställer ditt rs med 30 poster
Set rs = New ADODB.Recordset
rs.Fields.Append "MyField", adInteger
rs.Open
For i = 1 To 30
rs.AddNew "MyField", i
Next

'Använd posterna i RS enligt slumpad ordning
For i = 1 To ANTAL_SLUMPADE
rs.AbsolutePosition = CInt((30 - 1) * Rnd + 1)
'Symboliskt användande av slumpat data från recordsetet.
temp = rs.Fields("MyField").Value
'Debug.Print temp 'Med Debug enablat tar det ca 9 sek att köra hela funktionen
Next

rs.Close

End Sub
</code>


Svara

Sv:Slumpa i recordset

Postades av 2005-09-27 12:51:13 - Ola Lindfeldt

Typ samma som föregående postare,en jag postar det ändå. :)
10.000 värden skapas och slumpas sedan fram..
Mindre än 1 sek på min P4 @ 3 Ghz.. :)


<code>
Private Sub Command1_Click()
Dim rs As ADODB.Recordset
Dim i As Long
Dim randomID As Long
Dim min As Long, max As Long
Dim dataStr(1) As String

Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient

rs.Fields.Append "ID", adInteger, 4
rs.Fields.Append "Text", adVarChar, 30
rs.Open

min = 1
max = 10000
dataStr(0) = "Text "

For i = min To max
rs.AddNew
rs.Fields(0).Value = i
dataStr(1) = i
rs.Fields(1).Value = Join(dataStr, "")
Next

randomID = CLng((max - min + 1) * Rnd) + min
rs.AbsolutePosition = randomID
MsgBox "Random stuff: " & vbCrLf & _
rs.GetString(adClipString, 1, ", ")
rs.Close
End Sub
</code>


Svara

Sv: Slumpa i recordset

Postades av 2005-09-27 21:57:18 - Rasmus Ågren

Tack till alla som hjälpt mig! Det verkar som felet ligger någon annanstans men jag kan inte hitta det. Jag valde att läsa in databasen till en array och läsa ur den istället.


Svara

Nyligen

  • 18:37 Remove the bumper in AUDI
  • 15:35 Chicken road crash game
  • 21:41 Automotive Services UK
  • 20:44 Erfarenhet av CBD-olja mot sömnpro
  • 12:13 Sex Dolls for Sale
  • 19:42 Online Casinos for Haitian Players
  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 889
27 965
271 778
864
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies