This is pretty late, but I'm not sure if this can be done with a recursive CTE. However, I came up with a solution using the MODEL clause:
WITH SAMPLE (ID,GRP_ID,SCORE,RANK) AS ( SELECT 1,1,100,NULL FROM DUAL UNION SELECT 2,1,90,NULL FROM DUAL UNION SELECT 3,1,70,NULL FROM DUAL UNION SELECT 4,2,95,NULL FROM DUAL UNION SELECT 5,2,70,NULL FROM DUAL UNION SELECT 6,2,60,NULL FROM DUAL) SELECT ID,GRP_ID,SCORE,RANK FROM SAMPLE MODEL DIMENSION BY (ID,GRP_ID) MEASURES (SCORE,0 RANK,0 LAST_RANKED_GRP,0 ITEM_COUNT,0 HAS_RANK) RULES ITERATE (1000) UNTIL (ITERATION_NUMBER = ITEM_COUNT[1,1])
This is not very pretty, and I suspect there is a better way to do this, but it gives the expected result.
Cautions:
You need to increase the iteration counter if you have more than this number of lines.
This makes a complete re-ranking based on the score after each iteration. Therefore, if we took your sample data, but changed the initial score from 2 to 95, not 90: after ranking point 1 and providing a 10-point bonus to point 2, now it has a rating of 105. Thus, we rate it as 1 1st and move point 1 to the second. You must make several modifications if this is not the desired behavior.