Stellen Sie sich eine Tabelle vor, in der Besuche aufgezeichnet werden
create table visits (
person varchar(10),
ts timestamp,
somevalue varchar(10)
)
Betrachten Sie diese Beispieldaten (Zeitstempel als Zähler vereinfacht)
ts| person | somevalue
-------------------------
1 | bob |null
2 | bob |null
3 | jim |null
4 | bob | A
5 | bob | null
6 | bob | B
7 | jim | X
8 | jim | Y
9 | jim | null
Ich versuche, den letzten Nicht-Null-Wert der Person auf alle zukünftigen Besuche zu übertragen, bis sich dieser Wert ändert (dh der nächste Nicht-Null-Wert wird).
Die erwartete Ergebnismenge sieht folgendermaßen aus:
ts| person | somevalue | carry-forward
-----------------------------------------------
1 | bob |null | null
2 | bob |null | null
3 | jim |null | null
4 | bob | A | A
5 | bob | null | A
6 | bob | B | B
7 | jim | X | X
8 | jim | Y | Y
9 | jim | null | Y
Mein Versuch sieht so aus:
select *,
first_value(somevalue) over (partition by person order by (somevalue is null), ts rows between UNBOUNDED PRECEDING AND current row ) as carry_forward
from visits
order by ts
Hinweis: Der Wert (ein Wert ist null) wird zum Sortieren mit 1 oder 0 ausgewertet, damit ich den ersten Wert ungleich Null in der Partition erhalten kann.
Das Obige gibt mir nicht das Ergebnis, nach dem ich suche.
pg_dump
für Ihre Testdaten einfügen, anstatt die Daten in eine psql-Ausgabe und das Schema für die Tabelle einzufügen?pg_dump -t table -d database
Wir brauchen das Erstellen und dieCOPY
Befehle.