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中文网其他相关文章!