ホームページ >データベース >mysql チュートリアル >Postgres でウィンドウ関数と集計関数を正しく使用して累積損益を計算する方法

Postgres でウィンドウ関数と集計関数を正しく使用して累積損益を計算する方法

DDD
DDDオリジナル
2025-01-06 11:07:44718ブラウズ

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

Postgres のウィンドウ関数と例外によるグループ化

Postgres には、さまざまなパーティションにわたるデータを分析するためのウィンドウ関数が用意されています。ただし、これらを集計関数と組み合わせると、混乱やエラーが発生する可能性があります。

指定されたクエリで、ユーザーは時間の経過に伴うユーザーの累積損益を計算しようとしますが、次のエラーが発生します:

ERROR:  column "sp.payout" must appear in the GROUP BY clause or be used in an aggregate function

このエラーは、sp.payout と s.buyin に適用される SUM 関数が、OVER 句により実際にはウィンドウ関数であるために発生します。ウィンドウ関数は、パーティション内の値を集計するときにすべての行を保持します。

これを解決するには、最初にデータを集計してから、集計された値をウィンドウ関数で使用します。この場合、各イベントのペイアウトとバイインの合計を計算できます。

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。