x
user_id created_at status amount
_____________________________________________
10196 31-08-2019 15:38 billcreated 21900
10196 05-09-2019 05:40 billpaid 43800
10196 15-12-2019 15:54 billcreated 11200
10205 15-03-2019 16:02 billcreated 2700
10205 31-03-2019 16:02 billcreated 27000
10205 23-04-2019 09:54 billpaid 3000
to get this table i used the query as below
select id,user_id,created_at,status,amount
from settlementdata
order by user_id,STR_TO_DATE(created_at, '%d-%m-%Y %H:%i');
but now I want to get the table as below
user_id created_at status amount balance
______________________________________________________
10196 31-08-2019 15:38 billcreated 21900 21900 (as no previous records exits)
10196 05-09-2019 05:40 billpaid 43800 -21900 (balance - paid amount i.e 21900-43800)
10196 15-12-2019 15:54 billcreated 11200 -10700 (balance + bill created amount i.e -21900+11200)
10205 15-03-2019 16:02 billcreated 2700 2700 (as no previous records exits)
10205 31-03-2019 16:02 billcreated 27000 29700 (as 2700+27000)
10205 23-04-2019 09:54 billpaid 3000 26700 (as 29700-3000)
for this i used a query as below
select id, user_id,created_at,status, amount, sum(
case user_id
when lag(user_id) over(order by id) = user_id and status = "billcreated"
then amount
when lag(user_id) over(order by id) = user_id and status = "billpaid"
then amount*(-1)
else 0
end ) from (select id,user_id,created_at,status,amount from settlementdata
order by user_id,STR_TO_DATE(created_at, '%d-%m-%Y %H:%i')
limit ) as T;
but still I am unable to get the resulted tab rather I got an error message as UNKNOWN_CODE_PLEASE_REPORT: You cannot use the window function ‘lag’ in this context.
Any help that i can get for the same is highly appreciated.
Thanks in advance
Advertisement
Answer
SELECT *, SUM(CASE WHEN status = 'billcreated'
THEN amount
ELSE -amount
END) OVER (PARTITION BY user_id
ORDER BY STR_TO_DATE(created_at, '%d-%m-%Y %H:%i') ASC) balance
FROM settlementdata