Halihallo Stephan
selektiere über zwei Queries; und zwar so, dass die möglichst nächste obere und untere
Schranke findest (über ORDER BY mit LIMIT 1,0 kann man das nächst passende "objekt"
selektierenIch glaube Du hast da was mißverstanden: In der Tabelle stehen alle Meßdaten aller Motoren, und ich brauche in einer Abfrage die entsprechende Leistung für jeden Motor, der im gesuchten Drehzahlbereich die gesuchte Leistung liefern kann.
Das geht mit Deiner Lösung nicht, wenn ich sie richtig verstande habe.
Nun, du möchtest die Daten interpolieren. Der Weg über eine WHERE-Klausel ist ungenügend,
wenn du statistische Daten aufbereiten möchtest. Mathematisch korrekter wäre eine
Durchschnittsberechnung der nächstliegenden Daten und diese bekommst du über die genannte
ORDER BY und LIMIT Lösung. Aber vielleicht habe ich dich missverstanden und du hast
bereits eine sortierte Liste an Daten vorliegen (ich ging davon aus, dass du mehrere
"redundante" Messergebnisse hast und daraus eine Messkurve berechnen möchtest, nicht,
dass du dich auf die Daten in der Datenbank "verlässt").
Gehen wir von deiner ursprünglichen Kalkulation aus:
(leistung_min+(leistung_max-leistung_min)/(drehzahl-drehzahl_min)*(100-drehzahl_min))>3
leistung_min+(leistung_max-leistung_min)
ich schätze du meintest: (leistung_min+leistung_max) / 2 ? - Durchschnitt der Leistung?
diesen Wert lässt sich vorberechnen und in einer Spalte abbilden, auf die du einen Index
legen kannst. Somit kannst du sehr schnell die gesuchte Leistung finden.
was willst du eigentlich mit (...)/(drehzahl-drehzahl_min)*(100-drehzahl_min))>3
bezwecken? - Diese WHERE-Klausel macht IMHO keinen Sinn. Leistung/Drehzahl ist kein
mir bekannter Kennwert eines Motors. (korrigier mich, wenn ich irre!)
---
Nochmals von vorne: ;)
Du suchst eine Möglichkeit Indizies zu verwenden, um schnell zu Resultaten zu kommen.
Was spricht dagegen, die durchschnittliche Leistung und Drehzahl zu indizieren und
dann über eine WHERE-Klausel die gesuchte Drehzahl einzuschränken (+-100 z. B.)? -
Damit verkleinerst du die Datenmenge beträchtlich und kannst dann die verbleibenden
Daten ohne Probleme interpolieren (ohne einen Tag auf Resultate warten zu müssen).
Ich möchte jedoch bezweifeln, dass du über eine einfache WHERE-Klausel bzw. einfache
Berechnungen im SELECT-Stetement zu korrekten, vollständigen Daten kommen wirst.
Datenbanken dienen nicht umbedingt dazu, Daten zu interpolieren und mit nicht existenten
Daten zu hantieren (Datenbanken sind _Mengenorientiert_, sie basieren nicht auf
Funktionen, mitdenen du Daten hochrechnest).
Nun ja, irgendwie habe ich dein Problem wohl noch immer nicht ganz verstanden, deshalb
einige grundlegende Tipps, die dir vielleicht helfen:
Grundsatz lautet: Möglichst schnell unnötige Daten "rausschmeissen", d. h. über Indizies
und geeignete Abfragen den Datenbestand auf unmittelbar nützliche Daten zu reduzieren.
z. B. der Tipp mit dem Drehzahl-Bereich (wenn du die Leistung zu Drehzahl 366
interpolieren möchtest, brauchst du keine Werte über Leistung bei Drehzahl 1025).
Über Berechnete Spalten kann man nicht direkt einen Index legen. Wenn dieser Index
nützlich ist, muss die Abfrage in eine andere Tabelle abgebildet werden und _dort_ kann
man einen Index auf die transformierte (berechnete) Spalte legen.
Dein Problem ist mehrschichtig: Du versuchst a) relevante Daten zu selektieren und
b) diese nützlichen Daten hochzurechnen (interpolieren). Das sind zwei Paar Schuhe und
erzwingen meiner Ansicht nach auch _mindestens_ zwei SQL-Queries und eine Hilfstabelle.
Wenn du eine Script-Spache (Perl/PHP/...) verwendest, würde ich vorschlagen, dass du
die unmittelbar relevanten Daten aus der Datenbank holst und im Script diese reduzierten
Daten interpolierst. Ich würde desweiteren Vorschlagen, dass du eine neue Tabelle
anlegst, wo du die Leistungssteigerung (tangential zur Messkurve => leistung/drehzahl od.
umgekehrt) zu jeder Leistung oder Drehzahl (je nach dem, wonach du suchst) aufträgst.
Aufgrund dieser Kennzahl kannst du die Leistung zu einer Drehzahl einfach interpolieren.
Finden den nächst unteren/höheren Drehzahlbereich, lese den Leistungssteigerung/Drehzahl
Koeffizienten und berechne daraus die Leistung zur gesuchten Drehzahl. Damit kannst du
den Index über Drehzahl verwenden (schnelles auffinden des Koeffizienten) und über den
Koeffizienten kannst du schnell die interpolierte Leisung ermitteln.
Bist du eigentlich in der Zwischenzeit schon weitergekommen? - Was hast du gemacht?
Viele Grüsse
Philipp