PDA

Vollständige Version anzeigen : Aus einer Liste jeden dritten auswählen


Bernhard Kleine
20.02.2008, 09:24
hallo und guten morgen!

hat vielleicht jemand einen tipp für einen algorithmus, der aus einer liste jede dritte zeile auswählt?

herzlichen dank!

bernhard kleine

Gunter Avenius
20.02.2008, 09:30
Hallo,

AirCode:

Dim iDummy As Long

For iDummy = 1 To 30
If iDummy Mod 3 = 0 Then
Debug.Print "Eintrag " & iDummy
End If
Next

Bernhard Kleine
20.02.2008, 10:00
und wie bringe ich das in eine abfrage?

stadtwald
20.02.2008, 10:50
Hallo,

damit ich das richtig verstehe, Du hast eine Tabelle und willst mit einer
Abfrage nur jeder dritte Zeile angezeigt bekommen?

Viele Grüße

Patrick

Josef P.
20.02.2008, 11:13
Um jede 3. Zeile aus einer sortierten Liste per SQL auszuwählen, könnte man einen fortlaufenden Zähler (siehe FAQ 3.11 (http://www.donkarl.com?FAQ3.11)) erstellen und diesen wie von Gunter im Where-Ausdruck verwenden.

Ich probierte gerade eine etwas andere Variante aus, bei der ich den Zähler nicht per SQL ermittle, sondern ein Hilfsfunktion verwende.

Public Function DsCounter(ByVal varID As Variant, _
Optional ByVal lMod As Long = 1, _
Optional ByVal lStart As Long = -1) As Long
'Anm.: varID dient nur dazu,
' dass die Funktion bei jedem DS ausgeführt wird.

Static cnt As Long

If lStart >= 0 Then
cnt = lStart - 1
End If

cnt = cnt + 1

If lMod > 1 Then
DsCounter = cnt Mod lMod
Else
DsCounter = cnt
End If

End Function

angewendet in einer SQL-Anweisung:
SELECT
T.ID
FROM
Tabelle T
WHERE
DsCounter(T.ID,3)=1
AND
DsCounter(0,1,0)=0
ORDER BY
T.ID
Anm.: DsCounter(0,1,0)=0 setzt den Zähler wieder auf 0 zurück, wenn die Abfrage neu gestartet wird.

Ob diese Variante stabil läuft kann ich aber nicht sagen. :D

Bernhard Kleine
20.02.2008, 13:09
Das funktioniert noch nicht ganz so wie ich es möchte:

aus einer Tabelle mit

PatID
71
78
104
110
118

holt deine Funktion als Ergebnis 71 und 110 heraus

aus einer Abfrage, die ohne where Klausel die gleichen fünf Reihen enthält, aber nur 118?

Meine Idee war eigentlich, die 104 herauszuziehen.

Ich stehe auf dem Schlauch!

Josef P.
20.02.2008, 13:13
SELECT
T.ID
FROM
Tabelle T
WHERE
DsCounter(T.ID,3)=0
AND
DsCounter(0,1,0)=0
ORDER BY
T.ID
Damit sollte 104 geliefert werden bzw. der 6. DS (>118)

Anm.: DsCounter liefert nur das Ergebnis von Mod (siehe Code). mit DsCounter(T.ID,3) = 1 wird der 1., 4., 7. usw. DS der sortierten Liste geliefert.
Wichtig! Die gezeigte Funktion kann nicht gleichzeitig in 2 Abfragen eingesetzt werden!

Bernhard Kleine
20.02.2008, 16:46
Es funktioniert!

Danke.