WITH TMP AS ( SELECT 1 AS RNUM, 5 AS A FROM DUAL UNION ALL SELECT 2 , 10 FROM DUAL UNION ALL SELECT 3 , 15 FROM DUAL UNION ALL SELECT 4 , 20 FROM DUAL ) SELECT RNUM, A , CASE WHEN CURRENT_A_SUM <= 20 THEN A WHEN CURRENT_A_SUM - A >= 20 THEN 0 ELSE A - (CURRENT_A_SUM - 20) END B FROM ( SELECT RNUM , A , SUM(A) OVER (ORDER BY RNUM) AS CURRENT_A_SUM FROM TMP )