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.
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
Vous devez vous connecter pour publier un commentaire.
@Glenn vous a donné un très élégant solution avec une fonction d'agrégation. Mais pour répondre à votre question, une fonction plpgsql pourrait ressembler à ceci:
Configuration de Test:
Fonction générique
Appel:
Résultat:
Fonction spécifique, comme par question
Appel:
Résultat:
OriginalL'auteur Erwin Brandstetter
Je suppose que vous êtes à la recherche pour un agrégat de "produit" de la fonction. Vous pouvez créer vos propres fonctions d'agrégation dans Postgresql et Oracle.
Voir "Agrégats Définis par l'Utilisateur" dans la doc de Postgresql. L'exemple ci-dessus, j'ai emprunté de
ici. Il y a d'autres stackoverflow réponses qui montrent d'autres méthodes pour ce faire.
OriginalL'auteur Glenn