PostgreSQL - wie soll ich first_value()?

Diese Antwort zeigt, wie die produzieren, High/Low/Open/Close-Werte aus einem ticker:
Abrufen Aggregate für beliebige Zeitintervalle

Ich versuche eine Lösung implementieren auf dieser Basis (S. 9.2), aber ich habe Mühe, den richtigen Wert für first_value().

So weit, ich habe versucht, zwei Fragen:

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 das Ergebnis:

        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, ist der richtige Wert für first_value() sollte 77.0.

Obwohl ich dies könnte durch eine unklare ORDER BY im WINDOW sein, also habe ich diese zu

ORDER BY cstamp ASC 

aber dies scheint zu stören das PARTITION:

        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 letzten jetzt variieren innerhalb der partition.

Was mache ich falsch? Könnte mir jemand helfen, besser zu verstehen, die Beziehung zwischen PARTITION und ORDER innerhalb einer WINDOW?


Obwohl ich die Antwort haben, hier ist eine abgespeckte pg_dump, das wird niemandem gestatten, erstellen Sie die Tabelle. Das einzige, was anders ist, ist der name der Tabelle.

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 einfacher, wenn Sie eine test-Tabelle, zum Beispiel als SQLfiddle (random Beispiel).
Sicher, dass die erste Bestellung durch alle Zeilen innerhalb der partition gleich. Damit können die Zeilen, Faust oder der Letzte. Jetzt die zweite ist die richtige. Es sieht für mich sollte es funktionieren. Es gibt etwas fehlt in Ihrem Bericht. @Erwin erzählte, das Sie produzieren, test-Daten, die reproduziert werden können.
Ich bin traurig über den fehlenden test-Tabelle. Ich habe einen am Ende in die Frage. Ich fürchte, ich fand SQLFiddle ein bisschen einschüchternd -- habe ich nicht bekommen, meine Füße ganz diesem nassen sehr oft.
BTW, ich habe nur messing mit Postgresql seit den letzten paar Tagen übersiedelt teilweise aus einer MySql-user. Ich bin wirklich beeindruckt.

InformationsquelleAutor Brent.Longborough | 2013-03-30

Schreibe einen Kommentar