with balance_with_prev as
(
select
bal_date::date
, code
, coalesce(value,0) as current_balance_value
, lag( coalesce(value,0), 1) over(partition by code order by bal_date asc) as prev_balance_value
from benefit_balances
)
, daily_points_transactions as
(
select
code
, created_at::date as trans_date
, coalesce(sum(case when direction=1 then cust_sum else 0 end),0) as points_add
, coalesce(sum(case when direction=0 then cust_sum else 0 end),0) as points_spent
from benefit_points
group by 1,2
)
Select
bwp.bal_date
, bwp.code
, bwp.current_balance_value
, bwp.prev_balance_value
, dpt.points_add
, dpt.points_spent
, case
when bwp.prev_balance_value is null and bwp.current_balance_value = 0 then true --ΠΏΠ΅ΡΠ²Π°Ρ Π·Π°ΠΏΠΈΡΡ
when bwp.prev_balance_value is null and bwp.current_balance_value != 0 then false -- ΠΎΡΠΈΠ±ΠΊΠ° ΠΏΠ΅ΡΠ²ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½Π΅ ΠΏΠΎΡΠΈΡΡΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
when bwp.current_balance_value=bwp.prev_balance_value+dpt.points_add-dpt.points_spent then true
else false
end as is_match
from balance_with_prev bwp
left join daily_points_transactions dpt on dpt.code=bwp.code AND dpt.trans_date = DATEADD('day', -1, bwp.bal_date)
-- where bwp.prev_balance_value is not null and bwp.current_balance_value != 0
-- Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ΠΌ Ρ ΠΎΡΠ΅ΡΡ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ, ΠΎΡ Π½ΡΠ»Π΅Π²ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΈΡ
order by 2,1