Hi everyone,
I am trying to correlate several sparse time series with disjunct time-points
in such a way that null values (via left join) are replaced by the most recent
value in each time series respectively.
Each series only records changes in values, which are then assumed to remain
constant until the next change.
Here's a small self-contained example with various attempts at getting the
expected results:
with
s1( t, v ) as ( values ( 1, 's1-a' ), ( 3, 's1-c' ) ),
-- series 1
s2( t, v ) as ( values ( 1, 's2-a' ), ( 4, 's2-d' ) ),
-- series 2
s3( t, v ) as ( values ( 2, 's3-b' ), ( 6, 's3-f' ) ),
-- series 3
ts( t ) as ( select t from s1 union select t from s2 union select t from s3
) -- all time stamps
select
ts.t as t,
s1.v as s1_v,
-- what I would like/expect to work
last_value( s1.v )
-- filter ( where s1.v is not null ) -- error
over ( order by s1.t ) as s1_lv,
-- further (failed) attempts...
last_value( s2.v )
over ( order by s2.t rows unbounded preceding ) as s2_lv_rows,
last_value( s3.v )
over ( order by s3.t rows unbounded preceding ) as s3_lv_rows,
last_value( s3.v )
over ( order by s3.t range unbounded preceding ) as s3_lv_range,
last_value( s3.v )
over ( order by s3.t groups unbounded preceding ) as s3_lv_groups,
-- no idea what this could be useful for - taken from sqlite docs
last_value( s3.v )
over ( order by s3.t
rows between unbounded preceding and unbounded following
) as s3_lv_all
from
ts
left join s1 on s1.t = ts.t
left join s2 on s2.t = ts.t
left join s3 on s3.t = ts.t
order by
ts.t
;
Results:
t s1_v s1_lv s2_lv_rows s3_lv_rows s3_lv_range s3_lv_groups s3_lv_all
- ---- ----- ---------- ---------- ----------- ------------ ---------
1 s1-a s1-a s2-a ~ ~ ~ s3-f
2 ~ ~ ~ s3-b s3-b s3-b s3-f
3 s1-c s1-c ~ ~ ~ ~ s3-f
4 ~ ~ s2-d ~ ~ ~ s3-f
6 ~ ~ ~ s3-f s3-f s3-f s3-f
Expected results:
t s1_v s1_lv s2_lv_rows s3_lv_rows s3_lv_range s3_lv_groups s3_lv_all
- ---- ----- ---------- ---------- ----------- ------------ ---------
1 s1-a s1-a s2-a ~ ~ ~ s3-f
2 ~ s1-a s2-a s3-b s3-b s3-b s3-f
3 s1-c s1-c s2-a s3-b s3-b s3-b s3-f
4 ~ s1-c s2-d s3-b s3-b s3-b s3-f
6 ~ s1-c s2-d s3-f s3-f s3-f s3-f
The "filter ( where ... is not null )" clause *seems* like it should do what I
want, but it just produces the error: "FILTER clause may only be used with
aggregate window functions" :-(
In oracle I would use "last_value( ... ) ignore nulls over ( ... )".
Is this somehow possible in SQLite (3.30.1)?
Should I open a ticket?
Thanks,
Steve
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users