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
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to