Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I fill null columns with values from the previous row?

I am trying to perform something here. I want to have all the coluns filled with values. But when I have the null column, I want to have it filled with the value from the previous not null column.

with cte as (
select '2019-11-12 16:01:55' as timestamp, null as owner_id, null as owner_assigneddate, null as lastmodifieddate union all
select '2019-11-12 19:03:18' as timestamp, 39530934 as owner_id, '2019-11-12 19:03:18' as owner_assigneddate, '2019-11-12 19:03:18' as lastmodifieddate union all
select '2019-11-12 19:03:19' as timestamp, null as owner_id, null as owner_assigneddate, '2019-11-12 19:03:19' as lastmodifieddate union all
select '2019-11-12 19:03:20' as timestamp, null as owner_id, null as owner_assigneddate, '2019-11-12 19:03:20' as lastmodifieddate union all
select '2019-11-12 19:03:31' as timestamp, 40320368 as owner_id, '2019-11-12 19:03:31' as owner_assigneddate, '2019-11-12 19:03:31' as lastmodifieddate union all
select '2019-11-12 19:03:33' as timestamp, null as owner_id, null as owner_assigneddate, '2019-11-12 19:03:33' as lastmodifieddate union all
select '2019-11-12 19:03:56' as timestamp, null as owner_id, null as owner_assigneddate, '2019-11-12 19:03:356' as lastmodifieddate)

select timestamp,
       owner_id,
       owner_assigneddate,
       lastmodifieddate,
       COALESCE(owner_id, LEAD(owner_id) OVER(ORDER BY timestamp DESC)) AS test_column
from cte order by timestamp asc 

With the previous query I already managed to put the value only in the next row.

What I want to do is to have the all the columns filled with the value based on the previous row. The value from row 4 should be 39530934 and the value from row 7 should be 40320368. I think I am missing something here, but I dont't know what.

like image 940
João Maia Avatar asked Oct 12 '25 01:10

João Maia


2 Answers

In BigQuery use LAST_VALUE() with the IGNORE NULLS option and COALESCE():

select timestamp,
       COALESCE(owner_id, last_value(owner_id ignore nulls) over (order by timestamp)) as owner_id,
       COALESCE(owner_assigneddate, LAST_VALUE(owner_assigneddate IGNORE NULLS) OVER (ORDER BY TIMESTAMP)) as owner_assigneddate,
       COALESCE(lastmodifieddate, LAST_VALUE(lastmodifieddate IGNORE NULLS) OVER (ORDER BY TIMESTAMP)) as lastmodifieddate
from cte order by timestamp asc 
like image 94
Gordon Linoff Avatar answered Oct 14 '25 16:10

Gordon Linoff


This should work with your cte definition:

...
select timestamp,
       owner_id,
       owner_assigneddate,
       lastmodifieddate,
       LAST_VALUE(owner_id IGNORE NULLS) 
            OVER(ORDER BY timestamp ASC ROWS BETWEEN 
                 UNBOUNDED PRECEDING AND CURRENT ROW) AS test_column
from cte order by timestamp asc 
like image 36
Michael Entin Avatar answered Oct 14 '25 17:10

Michael Entin