with balance as (
select
block_number, bal_delta, prev_bal, token_name, user_address, {{on_date}} as on_date
from ethereum.core.ez_balance_deltas
where 1=1
and block_timestamp < '{{on_date}}'
and contract_address = '{{token_address}}'
),
balance_row_number as (
select
on_date, block_number, bal_delta + prev_bal as balance_on_date, token_name, user_address,
ROW_NUMBER() OVER (PARTITION BY user_address ORDER BY block_number desc) as row_num
from balance
)
select
on_date, user_address, token_name, balance_on_date
from balance_row_number
where row_num = 1 and balance_on_date > 0
order by balance_on_date desc