I want to find a way to get the last non-null value for a purchase of a user. For example, I have this:

date | user_id | purchase_amount 2020-01-01 | 1 | 39 2020-01-04 | 1 | null 2020-01-10 | 1 | 90 2020-01-15 | 1 | null 

I want if to fill in the following way:

date | user_id | purchase_amount 2020-01-01 | 1 | 39 2020-01-04 | 1 | 39 2020-01-10 | 1 | 90 2020-01-15 | 1 | 90 

Right now, I am using a LEAD function partition by user_id but it still would consider even non-null values. How to approach this?

1 Answer

As a disclaimer, this answer is largely based on the excellent accepted answer to this SO question. This answer creates a pseudo-group for each block of records which should ultimately be assigned the same purchase amount. It then uses the FIRST_VALUE() function, which should be available on Redshift, to fill in the null gaps.

WITH cte AS ( SELECT *, SUM(CASE WHEN purchase_amount IS NULL THEN 0 ELSE 1 END) OVER (PARTITION BY user_id ORDER BY date) AS grp FROM yourTable ) SELECT date, user_id, FIRST_VALUE(purchase_amount) OVER (PARTITION BY grp, user_id ORDER BY date) AS purchase_amount FROM cte ORDER BY user_id, date; 

screen capture from demo link below

Demo

Note that the demo is for Postgres, but the code should also run on Redshift with no modification necessary.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.