PostgreSQL fonction avec une boucle

Je ne suis pas bon à postgres fonctions. Pourriez-vous m'aider?
Dites, j'ai cette db:

name    | round   |position | val
-----------------------------------
A       | 1       | 1       | 0.5
A       | 1       | 2       | 3.4
A       | 1       | 3       | 2.2
A       | 1       | 4       | 3.8
A       | 2       | 1       | 0.5
A       | 2       | 2       | 32.3
A       | 2       | 3       | 2.21
A       | 2       | 4       | 0.8

Je veux écrire une Postgres fonction de boucle de position=1 à position=4 et calculer la valeur correspondante. Je pourrais le faire en python, avec psycopg2:

import psycopg2
import psycopg2.extras

conn = psycopg2.connect("host='localhost' dbname='mydb' user='user' password='pass'")
CURSOR = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cmd = """SELECT name, round, position, val from mytable"""
CURSOR.execute(cmd)
rows = CURSOR.fetchall()

dict = {}
for row in rows:
    indx = row['round']
    try:
        dict[indx] *= (1-row['val']/100)
    except:
        dict[indx] = (1-row['val']/100)
    if row['position'] == 4:
        if indx == 1:
            result1 = dict[indx]
        elif indx == 2:
            result2 = dict[indx]
print result1, result2

Comment puis-je faire la même chose directement dans Postgres de sorte qu'elle retourne un tableau de (name, result1, result2)

Mise à JOUR:
@a_horse_with_no_name, la valeur attendue serait:

result1 = (1 - 0.5/100) * (1 - 3.4/100) * (1 - 2.2/100) * (1 - 3.8/100) = 0.9043
result2 = (1 - 0.5/100) * (1 - 32.3/100) * (1 - 2.21/100) * (1 - 0.8/100) = 0.6535
C'est qu'une somme par la valeur de "tour"? Pouvez-vous nous montrer la sortie attendue pour votre échantillon de données?
Salut, reportez-vous à la section mise à Jour 😀 merci
tl;dr mais apparemment, vous pourriez être à la recherche for PostgreSQL est les fonctions de la fenêtre. Voir postgresql.org/docs/current/static/tutorial-window.html pour plus d'info.

OriginalL'auteur BPm | 2012-01-18