首頁 > 資料庫 > mysql教程 > 如何在Postgres中正確使用視窗函數和聚合函數來計算累計損益?

如何在Postgres中正確使用視窗函數和聚合函數來計算累計損益?

DDD
發布: 2025-01-06 11:07:44
原創
698 人瀏覽過

How to Correctly Use Window Functions with Aggregate Functions in Postgres to Calculate Cumulative Profit/Loss?

Postgres 視窗函數和 Group By Exception

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板