Ich habe doch geschrieben, dass du die Funktionen anpassen musst, da diese in jeder SQL-Implementierung anders heißen. Und ohne int kann es ja nicht funktionieren, da bei id/5 für jede Id eine andere Zahl herauskommt und er so keine Gruppen bilden kann.
Schau dir folgendes an:
Code:
SELECT id, id/5, int(id/5) FROM tabelle;
Herauskommt so etwas:
id id/5 int(id/5)
1 0.2 0
2 0.4 0
3 0.6 0
4 0.8 0
5 1.0 1
6 1.2 1
7 1.4 1
8 1.6 1
9 1.8 1
10 2.0 2
11 2.2 2
12 2.4 2
13 2.6 2
14 2.8 2
15 3.0 3
16 3.2 3
Damit hat er mehrere gleiche Einträge, nach denen er gruppieren kann. Er fasst jetzt alle 0, alle 1, alle 2 usw. jeweils zu einer Gruppe zusammen und bestimmt von dieser das Maximun.
Laut PostgreSQl-Handbuch sollte / aber schon die ganzzahlige Division sein, d.h. obiges Bsp. sollte ohne int funktionieren (mit ganzen Zahlen als Id's). Wenn du den timestamp nehmen möchtest, kannst du versuchen mit [1] das gleiche hinzubekommen, z.B.
Code:
SELECT EXTRACT(HOUR FROM timestamp)/5 FROM tabelle;
Du musst nur darauf achten, dass alle timestamps, die in ein 5er Packet sollen, durch irgendeine Berechnung die gleiche Nummer produzieren.
Zu open/close:
Du kannst zu der in meinem vorigen Posting vorgeschlagenen Abfrage noch "min(timestamp) as mints, max(timestamp) as maxts" hinzufügen. Dann ergibt ein:
Code:
SELECT open FROM tabelle WHERE timestamp = r[0]["mints"];
den open-Wert der Zeile mit den kleinsten Timestamp, also den ersten Wert in dieser Gruppe. Analog das Gleiche für close.
Wenn du diese Auswertungen nun über die ganze Tabelle haben möchtest, kannst du in einer Abfrage alles erledigen:
Code:
SELECT max(high) as high, min(low) as low, sum(volume) as vol,
count(*) as cnt, min(timestamp) as mints, max(timestamp) as maxts
FROM tabelle
GROUP BY int(id/5);
Jetzt hast du in r für jede 5er Gruppe eine Zeile und kannst sinngemäß schreiben:
Code:
for (i=0; i<r.size; i++) {
ohlc *OHLC = new ohlc;
OHLC->high = r[i]["high"];
OHLC->low = r[i]["low"];
OHLC->volume = r[i]["vol"];
if (r[i]["cnt"] != 5) {
// dieses Packet hat weniger als 5 Timestamps
}
query: s = SELECT open FROM tabelle WHERE timestamp = r[i]["mints"]
OHLC->open = s[0]["open"];
query: s = SELECT close FROM tabelle WHERE timestamp = r[i]["maxts"]
OHLC->close = s[0]["close"];
//OHLC irgendwo speichern (Liste)
}
Gruß,
Paul
[1] Datums/Zeit-Operationen
Lesezeichen