See last sentence of paragraph 3 of 
https://www.sqlite.org/windowfunctions.html#built_in_window_functions

Perhaps the following?

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 t,
         (select v
            from s1
           where t <= ts.t
             and v is not null
        order by t desc) as s1v,
         (select v
            from s2
           where t <= ts.t
             and v is not null
        order by t desc) as s2v,
         (select v
            from s3
           where t <= ts.t
             and v is not null
        order by t desc) as s3v
    from ts
order by t;


-- 
The fact that there's a Highway to Hell but only a Stairway to Heaven says a 
lot about anticipated traffic volume.

>-----Original Message-----
>From: sqlite-users <sqlite-users-boun...@mailinglists.sqlite.org> On
>Behalf Of ja...@opensauce.de
>Sent: Saturday, 28 December, 2019 20:45
>To: sqlite-users@mailinglists.sqlite.org
>Subject: [sqlite] last_value() without nulls?
>
>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



_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to