首页 >数据库 >mysql教程 >如何在Postgres中正确使用窗口函数和聚合函数来计算累计损益?

如何在Postgres中正确使用窗口函数和聚合函数来计算累计损益?

DDD
DDD原创
2025-01-06 11:07:44741浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn