Sto provando a mettere insieme una query che recupererà le statistiche di un utente (profitti/perdite) come risultato cumulativo, per un periodo di tempo.Funzione finestra Postgres e gruppo per eccezione
Ecco la domanda che ho finora:
SELECT p.name, e.date,
sum(sp.payout) OVER (ORDER BY e.date)
- sum(s.buyin) OVER (ORDER BY e.date) AS "Profit/Loss"
FROM result r
JOIN game g ON r.game_id = g.game_id
JOIN event e ON g.event_id = e.event_id
JOIN structure s ON g.structure_id = s.structure_id
JOIN structure_payout sp ON g.structure_id = sp.structure_id
AND r.position = sp.position
JOIN player p ON r.player_id = p.player_id
WHERE p.player_id = 17
GROUP BY p.name, e.date, e.event_id, sp.payout, s.buyin
ORDER BY p.name, e.date ASC
La query verrà eseguito. Tuttavia, il risultato è leggermente errato. Il motivo è che uno event
può avere più giochi (con diverso sp.payouts
). Pertanto, quanto sopra risulta con più righe se un utente ha 2 risultati in un evento con pagamenti diversi (cioè ci sono 4 giochi per evento, e un utente ottiene £ 20 da uno e £ 40 da un altro).
La soluzione ovvia sarebbe quella di modificare il GROUP BY
a:
GROUP BY p.name, e.date, e.event_id
Tuttavia, Postgres lamenta a questo dato che non sembra essere riconoscendo che sp.payout
e s.buyin
sono all'interno di una funzione di aggregazione. Ho ricevuto l'errore:
column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Sono in esecuzione 9.1 su server Ubuntu Linux.
Mi manca qualcosa o potrebbe essere un vero difetto in Postgres?
La prima query funziona, tuttavia, l'uscita della query non è dando i risultati richiesti. Posso vedere quale emendamento funzionerebbe in teoria, ma a Postgres non piace. Proverò quanto sopra più tardi e ti faccio sapere. tuttavia, sembra che ci saranno 2 righe nell'output della tua query se un "event_id" ha più di un importo di "pagamento". – Martin
ho appena provato con le modifiche che hai suggerito, e lo fa tornare con più righe dove ci sono più valori sp.payout per un singolo event_id. – Martin
@ Martin: vedere la mia risposta modificata. –