PDA

Vollständige Version anzeigen : datenzugriff median


ilka
09.08.2001, 13:22
Ich möchte eine Excel-Tabellenfunktion (Verweis ist gesetzt) für die Berechnung eines Gleitenden Medians nutzen und habe Schwierigkeiten dies zu lösen, da ich bislang nur SQL-Statements für Abfragen und Berechnungen benutzt habe. Konkret fehlt mir der Bezug für den Datenzugriff auf eine Tabelle und die Auswahl auf diese und das Schreiben in eine bestehende.
Aber ich möchte direkt die Aufgabe beschreiben, um nicht gleich den falschen Ansatz vorzugeben.

Die Datentabelle tblAir hat lediglich zwei Datenfelder idOrdNum und dtAirData.
idOrdNum hat eine laufende Nummer (1,2..40000) und dtAirData hat Werte > 0 sowie Nullwerte (Single).

Die Berechnung eines Median erfolgt pro idOrdNum mit Berücksichtigung der dtAirData von jeweils 1344 Werte vor und danach.
z.B: für idOrdNum = 5000 wäre zur Berechnung eines Median der Wertebereich der dtAirData mit den idOrdNUm von 3556 bis 6344 relevant; für den idOrdNUm = 5001 entsprechend 3557 bis 6345 etc.
Ich denke an eine Schleife, die dann jede einzelne idOrdNum abarbeitet und entsprechend den Median in die Tabelle tblAirMedian mit idOrdNum und dtAirDataMedian schreibt.

Eine Antwort in vielleicht ausführlicher Form wäre sehr nett!
Danke Vorab Ilka


Function AirMedian()

Dim db As database
Set db = CurrentDb()
Dim rs1 As Recordset
Set rs1 = db.OpenRecordset("tblAir", dbOpenTable)' Datentabelle
Dim rs2 As Recordset
Set rs2 = db.OpenRecordset("tblAirMedian", dbOpenTable) ' Ergebnistabelle

' Schleifenanfang und ende wird vorgegeben
for i = 2000 to 5000

'Auswahl des Wertebreichs
Excel.WorksheetFunction.Medianl ()

' Schreiben in die Ergebnistabelle tblAirMedian

next i

C. Palmetshofer
09.08.2001, 16:05
Hi,

habe schnell was zusammengebastelt...

'Daten in Array laden
Set db = CurrentDb
Set RS = db.OpenRecordset("tblAir")
RS.MoveLast: RS.MoveFirst
ReDim Arr(1 To RS.RecordCount, 2) As Long
cnt = 0
Do Until RS.EOF
cnt = cnt + 1
Arr(cnt, 1) = RS!Idx
Arr(cnt, 2) = RS!Wert
RS.MoveNext
Loop
RS.Close


Set RS = db.OpenRecordset("tblAirMedian")
If cnt > 1344 Then
'für gültigen Bereich
For i = 1345 To cnt - 1344
x = SysCmd(acSysCmdSetStatus, Trim(i))

'Array laden
ReDim tArr(1 To 2689)
xcnt = 0
For j = i - 1344 To i + 1344
xcnt = xcnt + 1
tArr(xcnt) = Arr(j, 2)
Next j

'Median berechnen
Sort tArr() 'Array sortieren (eigene Prozedur)
retVal = tArr(1345)

'Insert Ergebnis ...
RS.AddNew
RS!Idx = i
RS!Median = retVal
RS.Update
x = SysCmd(acSysCmdClearStatus)
Next i
End If
RS.Close


Gruss

ilka
09.08.2001, 16:21
Vielen Dank zunächst einmal !!
Muss mich erstmal einlesen. Soweit ich es verstehe wird der Median eigentlich gar nicht über die Funktion berechnet, sondern eben weil die Abstände des Wertebereiches immer identisch sind über die Rangfolge. Bei den Werten des Datenfeldes dtAirdata gibt es aber ungeschickterweise auch Nullwerte, die bei der Sortierung eigentlich raus müssten und nicht in der Rangnummer Berücksichtigt werden dürfen. Vielleicht kann dies aber mit der Funktion bzw. Info Anzahl der Datensätze umgehen?
(In meinem Fall ist der Median nicht so streng mathematisch aufzufassen, dass bei gerader Datenanzahl der Mittelwert gebildet werden müsste)

Gruss Ilka

C. Palmetshofer
10.08.2001, 06:50
Hallo Ilka,

1. Nullwerte können bereits beim Einlesen aus tblAir auschgeschlossen werden

...where not isnull(Wert)

2. 1344 Werte vorher, 1344 Werte nachher und der Wert für den der Median berechnet wird ergibt immer eine ungerade Zahl!

Gruss

ilka
10.08.2001, 08:11
moin moin,
ich bin mir nicht ganz sicher, ob meine Aufgabe richtig verarbeitet wird.

Nullwert dürfen in der auszuwählenden Datentabelle nicht berücksichtigt werden, womit die Anzahl der 1344 vor und 1344 danach sich ja vermindert. Der gleitende Median ist so zu verstehen, dass die festgesetzte Spanne bei Nullwerten nicht durch den Einbezug weiterer Werte über 1344 berechnet wird.
Wenn man irgendwie die Anzahl der Datensätze ohne Nullwerte zur Ermittlung des Rangs einsetzen könnte wäre das super, da dann die Funktion sogar für das zusätzliche Mass der Percentile interessant ist. (bei Percentilen kann der %Wert geändert werden z. B. 90 oder 10 %, wobei gilt: Median = 50 %Percentil).

Aber noch eine wichtige Frage zu:
Sort tArr() 'Array sortieren (eigene Prozedur)
wie genau ist das zu verstehen bzw. umzusetzen ( als eigene Prozedur)?

Gruss Ilka

WAG
10.08.2001, 08:33
Hi Ilka,
ist denn idOrdNum Primärschlüssel oder wie wählst Du Deine Sätze aus?

Dieter

ilka
10.08.2001, 08:40
Ja,idOrdNum ist auch der Primärschlüssel der Tabelle. Inhaltlich ist diese fortlaufende Nummer einer Zeit zugeordnet, deswegen auch die Eingrenzung des Datenbereichs für den Median. Es handelt sich insgesamt um Messwerte

WAG
10.08.2001, 09:10
Habs zwar nicht getestet aber vom Prinzip her müßte es so gehen.

Option Base 1
Public Sub S_Median(OrdNum As Long)
Dim DB As Database
Dim RS As Recordset
Dim i As Long
Dim MW(2689)
Erase MW
Set DB = CurrentDb
Set RS = DB.OpenRecordset("tblAir", dbOpenTable)
RS.Index = "PrimaryKey"
' Array mit Werten füllen
For i = OrdNum - 1344 To OrdNum + 1344
RS.Seek "=", i
If Not RS.NoMatch Then MW(i) = RS!dtAirData
Next i
RS.Close
' Median speichern
Set RS = DB.OpenRecordset("tblAirMedian")
RS.AddNew ' falls datensatz noch nicht existiert
RS!Idx = OrdNum
RS!Median = WorksheetFunction.Median(MW) ' Median berechnen
RS.Update
RS.Close
End Sub


Dieter

ilka
10.08.2001, 10:12
Hallo,
Jedenfalls Danke vorab, ich hoffe dass es klappt, sonst melde ich mich nochmal !
Gruss Ilka