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