Estoy tratando de armar una consulta que recuperará las estadísticas de un usuario (ganancia/pérdida) como un resultado acumulativo, durante un período de tiempo.Función de ventana de Postgres y grupo por excepción
Aquí es la consulta que tengo hasta ahora:
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 consulta se ejecutará. Sin embargo, el resultado es ligeramente incorrecto. La razón es que un event
puede tener múltiples juegos (con diferente sp.payouts
). Por lo tanto, lo anterior aparece con varias filas si un usuario tiene 2 resultados en un evento con diferentes pagos (es decir, hay 4 juegos por evento, y un usuario obtiene £ 20 de uno, y £ 40 de otro).
La solución obvia sería la de modificar la GROUP BY
a:
GROUP BY p.name, e.date, e.event_id
Sin embargo, Postgres se queja de esto, ya que no parece estar reconociendo que sp.payout
y s.buyin
se encuentran dentro de una función agregada. Me sale el error:
column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Estoy ejecutando 9.1 en el servidor Ubuntu Linux.
¿Me falta algo, o podría ser esto un defecto genuino en Postgres?
La primera consulta está funcionando, sin embargo, el resultado de la consulta no está dando los resultados requeridos. Puedo ver qué enmienda funcionaría en teoría, pero a Postgres no le gusta. Probaré lo anterior más adelante y te lo haré saber. sin embargo, parece que habrá 2 filas en el resultado de su consulta si un "event_id" tiene más de un monto de "pago". – Martin
Acabo de probarlo con las modificaciones que ha sugerido, y vuelve con varias filas donde hay múltiples valores de sp.payout para un único event_id. – Martin
@Martin: Vea mi respuesta enmendada. –