Próbuję użyć tej rekurencyjnej funkcji SQL, ale nie mogę go dostać, aby zrobić to, co chcę, nawet blisko. Zakodowałem logikę w rozwiniętej pętli, pytając, czy można ją przekonwertować na pojedyncze rekurencyjne zapytanie SQL, a nie na styl aktualizacji tabeli, z którego korzystałem.Podkursoria Oracle rekursywne Factoring przekonwertować
http://sqlfiddle.com/#!4/b7217/1
Istnieje sześć graczy w rankingu. Mają id, identyfikator grupy, wynik i rangę.
Stan początkowy
+----+--------+-------+--------+
| id | grp_id | score | rank |
+----+--------+-------+--------+
| 1 | 1 | 100 | (null) |
| 2 | 1 | 90 | (null) |
| 3 | 1 | 70 | (null) |
| 4 | 2 | 95 | (null) |
| 5 | 2 | 70 | (null) |
| 6 | 2 | 60 | (null) |
+----+--------+-------+--------+
Chcę podjąć osoba z najwyższym wynikiem początkowym i nadać im rangę 1. Wtedy stosuje się 10 punktów bonusowych na wynik każdego, kto ma ten sam identyfikator grupy. Weź następny najwyższy, przypisz rangę 2, rozdaj punkty bonusowe i tak dalej, dopóki nie pozostanie żaden gracz.
Identyfikator użytkownika zrywa więzy.
Punkty bonusowe zmieniają pozycję w rankingu. id = 4 początkowo wydaje się być na drugim miejscu z 95, za liderem z 100, ale z premią 10 punktów, id = 2 przesuwa się w górę i zajmuje miejsce.
stan końcowy
+-----+---------+--------+------+
| ID | GRP_ID | SCORE | RANK |
+-----+---------+--------+------+
| 1 | 1 | 100 | 1 |
| 2 | 1 | 100 | 2 |
| 4 | 2 | 95 | 3 |
| 3 | 1 | 90 | 4 |
| 5 | 2 | 80 | 5 |
| 6 | 2 | 80 | 6 |
+-----+---------+--------+------+