Я пытаюсь собрать запрос, который будет получать статистику пользователя (прибыль/убыток) как совокупный результат за определенный промежуток времени.Функция и группа окна 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
Запрос будет работать. Однако результат несколько неверен. Причина в том, что event
может иметь несколько игр (с разными sp.payouts
). Следовательно, вышесказанное выдается с несколькими строками, если у пользователя есть 2 результата в событии с разными выплатами (т. Е. На одно событие есть 4 игры, а пользователь получает £ 20 от одного и 40 фунтов за другого).
Очевидным решением было бы внесению поправок в GROUP BY
к:
GROUP BY p.name, e.date, e.event_id
Однако, Postgres жалуется на это, как не кажется, признают, что sp.payout
и s.buyin
внутри агрегатной функции. Я получаю сообщение об ошибке:
column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Я запускаю 9.1 на сервере Ubuntu Linux.
Я что-то упустил, или это может быть подлинным дефектом в Postgres?
Первый запрос работает, однако вывод запроса не дает требуемых результатов. Я вижу, какая поправка будет работать в теории, но Postgres не нравится. Я попробую это позже и дам вам знать. однако похоже, что в выводе вашего запроса будет 2 строки, если «event_id» имеет более одной суммы «выплаты». – Martin
Я просто попробовал его с поправками, которые вы предложили, и он возвращается с несколькими строками, где имеется несколько значений sp.payout для одного event_id. – Martin
@Martin: см. Мой исправленный ответ. –