Diese Antwort zeigt, wie High/Low/Open/Close-Werte von einem Ticker produzieren:
Retrieve aggregates for arbitrary time intervalsPostgreSQL - wie soll ich first_value() verwenden?
Ich versuche, eine Lösung zu diesem Thema (PG 9.2) auf der Basis zu implementieren, aber Schwierigkeiten habe die in immer Korrekter Wert für first_value()
.
Bisher habe ich versucht, zwei Anfragen:
SELECT
cstamp,
price,
date_trunc('hour',cstamp) AS h,
floor(EXTRACT(minute FROM cstamp)/5) AS m5,
min(price) OVER w,
max(price) OVER w,
first_value(price) OVER w,
last_value(price) OVER w
FROM trades
Where date_trunc('hour',cstamp) = timestamp '2013-03-29 09:00:00'
WINDOW w AS (
PARTITION BY date_trunc('hour',cstamp), floor(extract(minute FROM cstamp)/5)
ORDER BY date_trunc('hour',cstamp) ASC, floor(extract(minute FROM cstamp)/5) ASC
)
ORDER BY cstamp;
Hier ist ein Stück des Ergebnisses:
cstamp price h m5 min max first last
"2013-03-29 09:19:14";77.00000;"2013-03-29 09:00:00";3;77.00000;77.00000;77.00000;77.00000
"2013-03-29 09:26:18";77.00000;"2013-03-29 09:00:00";5;77.00000;77.80000;77.80000;77.00000
"2013-03-29 09:29:41";77.80000;"2013-03-29 09:00:00";5;77.00000;77.80000;77.80000;77.00000
"2013-03-29 09:29:51";77.00000;"2013-03-29 09:00:00";5;77.00000;77.80000;77.80000;77.00000
"2013-03-29 09:30:04";77.00000;"2013-03-29 09:00:00";6;73.99004;77.80000;73.99004;73.99004
Wie Sie sehen können, 77.8 ist nicht was ich glaube, das ist richtig Wert für first_value()
, der 77.0 sein sollte.
ich aber dies könnte in der WINDOW
auf die mehrdeutige ORDER BY
fällig, also habe ich dies zu
ORDER BY cstamp ASC
aber dies scheint die PARTITION
auch aufregen:
cstamp price h m5 min max first last
"2013-03-29 09:19:14";77.00000;"2013-03-29 09:00:00";3;77.00000;77.00000;77.00000;77.00000
"2013-03-29 09:26:18";77.00000;"2013-03-29 09:00:00";5;77.00000;77.00000;77.00000;77.00000
"2013-03-29 09:29:41";77.80000;"2013-03-29 09:00:00";5;77.00000;77.80000;77.00000;77.80000
"2013-03-29 09:29:51";77.00000;"2013-03-29 09:00:00";5;77.00000;77.80000;77.00000;77.00000
"2013-03-29 09:30:04";77.00000;"2013-03-29 09:00:00";6;77.00000;77.00000;77.00000;77.00000
da die Werte für max und zuletzt jetzt variieren innerhalb der Partition.
Was mache ich falsch? Könnte mir jemand besser helfen, die Beziehung zwischen PARTITION
und ORDER
innerhalb einer WINDOW
zu verstehen?
Obwohl ich eine Antwort haben, ist hier eine abgespeckte pg_dump die jedermann erlaubt, die Tabelle zu erstellen. Das einzige, was anders ist, ist der Tabellenname.
CREATE TABLE wtest (
cstamp timestamp without time zone,
price numeric(10,5)
);
COPY wtest (cstamp, price) FROM stdin;
2013-03-29 09:04:54 77.80000
2013-03-29 09:04:50 76.98000
2013-03-29 09:29:51 77.00000
2013-03-29 09:29:41 77.80000
2013-03-29 09:26:18 77.00000
2013-03-29 09:19:14 77.00000
2013-03-29 09:19:10 77.00000
2013-03-29 09:33:50 76.00000
2013-03-29 09:33:46 76.10000
2013-03-29 09:33:15 77.79000
2013-03-29 09:30:08 77.80000
2013-03-29 09:30:04 77.00000
\.
Es würde die Dinge vereinfachen, wenn Sie eine Testtabelle bereitstellen, zum Beispiel als [SQLfiddle (zufälliges Beispiel)] (http://sqlfiddle.com/#!12/2346e). –
Sicher die erste Reihenfolge, indem Sie alle Zeilen innerhalb der Partition gleich machen. So kann jede der Reihen zur Faust oder zum Letzten werden. Jetzt ist die zweite die richtige. Es sieht für mich aus, dass es funktionieren sollte. In Ihrem Bericht fehlt etwas. Wie @Erwin Ihnen sagte, produzieren Sie Testdaten, wo diese reproduziert werden können. –
@ErwinBrandstetter Es tut mir leid wegen der fehlenden Testtabelle. Ich habe eine am Ende der Frage hinzugefügt. Ich fürchte, ich fand SQLFiddle ein bisschen einschüchternd - ich bekomme meine Füße ziemlich oft nicht so nass. –