ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。