Tôi đang cố gắng kết hợp một truy vấn sẽ truy lục số liệu thống kê của người dùng (lợi nhuận/thua lỗ) dưới dạng kết quả tích lũy, trong một khoảng thời gian.Chức năng và nhóm cửa sổ Postgres theo ngoại lệ
Dưới đây là các truy vấn tôi có cho đến nay:
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
Truy vấn sẽ chạy. Tuy nhiên, kết quả hơi sai. Lý do là một event
có thể có nhiều trò chơi (với khác nhau sp.payouts
). Do đó, ở trên có nhiều hàng nếu người dùng có 2 kết quả trong một sự kiện với các khoản thanh toán khác nhau (nghĩa là có 4 trò chơi cho mỗi sự kiện và người dùng nhận được 20 đô la từ một sự kiện và 40 đô la từ một người khác).
Các giải pháp hiển nhiên sẽ là sửa đổi GROUP BY
tới:
GROUP BY p.name, e.date, e.event_id
Tuy nhiên, Postgres phàn nàn ở đây là nó không xuất hiện để được thừa nhận rằng sp.payout
và s.buyin
là bên trong một chức năng tổng hợp. Tôi gặp lỗi:
column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
Tôi đang chạy 9.1 trên máy chủ Ubuntu Linux.
Tôi có thiếu thứ gì đó hay đây có phải là lỗi chính hãng trong Postgres không?
Truy vấn đầu tiên đang hoạt động, tuy nhiên, đầu ra của truy vấn không đưa ra kết quả được yêu cầu. Tôi có thể thấy những gì sửa đổi sẽ làm việc trong lý thuyết, nhưng Postgres không thích nó. Tôi sẽ thử những điều sau và cho bạn biết. tuy nhiên, có vẻ như sẽ có 2 hàng trong kết quả truy vấn của bạn nếu một "event_id" có nhiều hơn một "khoản thanh toán". – Martin
Tôi vừa thử nó với các sửa đổi bạn đã đề xuất, và nó trở lại với nhiều hàng, nơi có nhiều giá trị sp.payout cho một event_id duy nhất. – Martin
@Martin: Xem câu trả lời đã sửa đổi của tôi. –