Postgres 提供視窗函數來分析不同分割區的資料。但是,將它們與聚合函數組合可能會導致混亂和錯誤。
在給定的查詢中,使用者嘗試計算使用者隨時間的累積利潤/損失,但遇到錯誤:
ERROR: column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function
出現此錯誤的原因是,由於OVER 子句,應用於sp.payout 和s.buyin 的SUM 函數實際上是視窗函數。視窗函數在聚合分區內的值時保留所有行。
要解決此問題,請先聚合數據,然後在視窗函數中使用聚合值。在這種情況下,我們可以計算每個事件的支出和買入總和:
SELECT p.name, e.event_id, e.date, SUM(SUM(sp.payout)) OVER w - SUM(SUM(s.buyin)) OVER w AS "Profit/Loss" FROM player AS p JOIN result AS r ON r.player_id = p.player_id JOIN game AS g ON g.game_id = r.game_id JOIN event AS e ON e.event_id = g.event_id JOIN structure AS s ON s.structure_id = g.structure_id JOIN structure_payout AS sp ON sp.structure_id = g.structure_id AND sp.position = r.position WHERE p.player_id = 17 GROUP BY e.event_id WINDOW w AS (ORDER BY e.date, e.event_id) ORDER BY e.date, e.event_id;
這裡,外部 SUM 函數匯總事件內所有結果的值,然後視窗函數計算累積利潤/損失。
以上是如何在Postgres中正確使用視窗函數和聚合函數來計算累計損益?的詳細內容。更多資訊請關注PHP中文網其他相關文章!