Próbuję utworzyć zapytanie, które pobierze statystyki użytkownika (zysk/strata) jako wynik skumulowany w pewnym okresie.Funkcja okna Postgres i grupa według wyjątku
Oto zapytanie mam tak daleko:
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
Zapytanie zostanie uruchomiony. Jednak wynik jest nieco niepoprawny. Powodem jest to, że event
może mieć wiele gier (z różnymi sp.payouts
). W związku z powyższym powyższe dane są wyświetlane z wieloma wierszami, jeśli użytkownik ma 2 wyniki w przypadku różnych wypłat (np. W jednym przypadku są 4 gry, a użytkownik otrzymuje 20 GBP od jednego, a 40 GBP od innego).
Oczywistym rozwiązaniem byłoby wprowadzenie zmian do GROUP BY
do:
GROUP BY p.name, e.date, e.event_id
Jednak Postgres skarży się na to, ponieważ nie wydaje się być uznanie, że sp.payout
i s.buyin
są wewnątrz funkcji zbiorczej. Otrzymuję komunikat o błędzie:
column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Uruchomiłem 9.1 na serwerze Ubuntu Linux.
Czy brakuje mi czegoś, czy może to być prawdziwa wada Postgres?
Pierwsze zapytanie działa, ale wynik zapytania nie daje wymaganych wyników. Widzę, co poprawka będzie działała w teorii, ale Postgresowi to się nie podoba. Spróbuję tego później i dam ci znać. Wygląda jednak na to, że w wynikach zapytania znajdą się 2 wiersze, jeśli "event_id" ma więcej niż jedną kwotę "wypłaty". – Martin
Po prostu próbowałem go z poprawkami, które zasugerowałeś, i powraca z wieloma wierszami, gdzie istnieje wiele wartości sp.payout dla jednego event_id. – Martin
@Martin: Zobacz moją poprawioną odpowiedź. –