Considera una tabella che registra le visite
create table visits (
person varchar(10),
ts timestamp,
somevalue varchar(10)
)
Considera questi dati di esempio (timestamp semplificato come contatore)
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
Sto cercando di riportare l'ultimo valore non nullo della persona a tutte le sue visite future fino a quando quel valore cambia (cioè diventa il successivo valore non nullo).
Il set di risultati previsto è simile al seguente:
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
Il mio tentativo è simile al seguente:
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
Nota: il (somevalue è null) restituisce 1 o 0 ai fini dell'ordinamento in modo da poter ottenere il primo valore non nullo nella partizione.
Quanto sopra non mi dà il risultato che sto cercando.
pg_dump
dati dei test anziché incollarli in un output psql e lo schema per la tabella?pg_dump -t table -d database
abbiamo bisogno di creare eCOPY
comandi.