0

Lets say I have the following data:

+---------------------+---------+---------------------+
| date                | tokenId | last_price          |
|---------------------+---------+---------------------|
| 2021-07-01 00:00:00 | 1       | <null>              |
| 2021-08-01 00:00:00 | 1       | 5.0                 |
| 2021-09-01 00:00:00 | 1       | <null>              |
| 2021-10-01 00:00:00 | 1       | <null>              |
| 2021-11-01 00:00:00 | 1       | 4.6000000000000005  |
| 2021-12-01 00:00:00 | 1       | <null>              |
| 2022-01-01 00:00:00 | 1       | <null>              |
| 2022-02-01 00:00:00 | 1       | <null>              |
| 2022-03-01 00:00:00 | 1       | <null>              |
| 2022-04-01 00:00:00 | 1       | <null>              |
| 2022-05-01 00:00:00 | 1       | <null>              |
| 2021-07-01 00:00:00 | 18      | 0.09200000000000001 |
| 2021-08-01 00:00:00 | 18      | <null>              |
| 2021-09-01 00:00:00 | 18      | <null>              |
| 2021-10-01 00:00:00 | 18      | <null>              |
| 2021-11-01 00:00:00 | 18      | 7.6000000000000005  |
| 2021-12-01 00:00:00 | 18      | <null>              |
| 2022-01-01 00:00:00 | 18      | 15.200000000000001  |
| 2022-02-01 00:00:00 | 18      | <null>              |
| 2022-03-01 00:00:00 | 18      | <null>              |
| 2022-04-01 00:00:00 | 18      | <null>              |
| 2022-05-01 00:00:00 | 18      | <null>              |
+---------------------+---------+---------------------+

How could I fill the null rows with the last price of each token from the previous rows like that:

+---------------------+---------+---------------------+
| date                | tokenId | last_price          |
|---------------------+---------+---------------------|
| 2021-07-01 00:00:00 | 1       | <null>              |
| 2021-08-01 00:00:00 | 1       | 5.0                 |
| 2021-09-01 00:00:00 | 1       | 5.0                 |
| 2021-10-01 00:00:00 | 1       | 5.0                 |
| 2021-11-01 00:00:00 | 1       | 4.6000000000000005  |
| 2021-12-01 00:00:00 | 1       | 4.6000000000000005  |
| 2022-01-01 00:00:00 | 1       | 4.6000000000000005  |
| 2022-02-01 00:00:00 | 1       | 4.6000000000000005  |
| 2022-03-01 00:00:00 | 1       | 4.6000000000000005  |
| 2022-04-01 00:00:00 | 1       | 4.6000000000000005  |
| 2022-05-01 00:00:00 | 1       | 4.6000000000000005  |
| 2021-07-01 00:00:00 | 18      | 0.09200000000000001 |
| 2021-08-01 00:00:00 | 18      | 0.09200000000000001 |
| 2021-09-01 00:00:00 | 18      | 0.09200000000000001 |
| 2021-10-01 00:00:00 | 18      | 0.09200000000000001 |
| 2021-11-01 00:00:00 | 18      | 7.6000000000000005  |
| 2021-12-01 00:00:00 | 18      | 7.6000000000000005  |
| 2022-01-01 00:00:00 | 18      | 15.200000000000001  |
| 2022-02-01 00:00:00 | 18      | 15.200000000000001  |
| 2022-03-01 00:00:00 | 18      | 15.200000000000001  |
| 2022-04-01 00:00:00 | 18      | 15.200000000000001  |
| 2022-05-01 00:00:00 | 18      | 15.200000000000001  |
+---------------------+---------+---------------------+

I have found some good answer about the similar question here, but I can't understand how I can use it with additional grouping by tokenId field.

2 Answers 2

0

You could use lateral. ie:

select t1.date, t1.tokenid, coalesce(t1.last_price, p.last_price) last_price 
from myTable t1
left join lateral(select last_price 
                        from myTable t2
                        where t1.tokenId = t2.tokenId and t1.date > t2.date
                           and t2.last_price is not null
                        order by t2.date desc
                        limit 1) p on true
order by t1.tokenId, t1.date;
Sign up to request clarification or add additional context in comments.

Comments

0

One possible solution is :

SELECT a_date, tokenId, last_price,
       (SELECT last_price
        FROM   A_TABLE 
        WHERE  a_date = (SELECT MAX(a_date) 
                         FROM   A_TABLE AS A 
                         WHERE  A.a_date <= T.a_date AND last_price IS NOT NULL))
FROM   A_TABLE AS T

Some other uses windowing functions

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.