Postgres 視窗函數與Group By 異常
問題
問題正在尋求檢索時間的推移累積的使用者統計數據,但會遇到不準確的情況。當一個事件中存在多個遊戲時,查詢會為不同的支出產生多行。按事件ID分組的明顯解決方案失敗,提示錯誤:「列「sp.payout」必須出現在GROUP BY子句中或在聚合函數中使用。」
解決方案
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 p JOIN result r ON r.player_id = p.player_id JOIN game g ON g.game_id = r.game_id JOIN event e ON e.event_id = g.event_id JOIN structure s ON s.structure_id = g.structure_id JOIN structure_payout 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;
出現錯誤的原因是查詢使用視窗函數,而不是聚合函數,視窗函數在保留所有行的同時聚合每個分區的值。視窗函數要求其參數包含在 GROUP BY 子句中。 要解決此問題,可以將視窗函數和聚合函數結合起來,如下所示:
說明
在此查詢中,外部sum() 函數是一個視窗函數,用於計算內部sum() 函數的總和。內部函數匯總每個事件中每個玩家的支出和買入。結果是每個玩家和事件一行,顯示累積利潤或損失。以上是如何在Postgres中正確使用視窗函數和GROUP BY來計算累積使用者統計資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!