Оконная функция Postgres и группировка по исключению

Я пытаюсь составить запрос, который будет извлекать статистику пользователя (прибыль / убыток) как совокупный результат, в течение периода времени.

Вот уже имеющийся у меня запрос:

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

Запрос будет выполнен. Однако результат немного неверный. Причина в том, что событие может иметь несколько игр (с разными sp.payout ). Следовательно, приведенное выше выводится с несколькими строками, если у пользователя есть 2 результата в событии с разными выплатами (т.е. есть 4 игры на событие, и пользователь получает 20 фунтов стерлингов с одного и 40 фунтов стерлингов с другого).

Очевидным решением было бы изменить GROUP BY на:

GROUP BY p.name, e.date, e.event_id

Однако Postgres жалуется на это, поскольку, похоже, не распознает, что sp.payout и s.buyin находятся внутри агрегатной функции. Я получаю сообщение об ошибке:

столбец "sp.payout" должен присутствовать в предложении GROUP BY или использоваться в агрегатная функция

Я использую 9.1 на сервере Ubuntu Linux.
Я что-то упустил или это настоящая неисправность Postgres?

12
задан Erwin Brandstetter 11 July 2015 в 22:42
поделиться