Я пытаюсь составить запрос, который будет извлекать статистику пользователя (прибыль / убыток) как совокупный результат, в течение периода времени.
Вот уже имеющийся у меня запрос:
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?