【发布时间】:2012-02-09 07:43:33
【问题描述】:
我正在尝试组合一个查询,该查询将检索用户在一段时间内的统计数据(利润/损失)作为累积结果。
这是我目前的查询:
SELECT p.name, e.date,
sum(sp.payout) OVER (ORDER BY e.date)
- sum(s.buyin) OVER (ORDER BY e.date) AS "Profit/Loss"
FROM result r
JOIN game g ON r.game_id = g.game_id
JOIN event e ON g.event_id = e.event_id
JOIN structure s ON g.structure_id = s.structure_id
JOIN structure_payout sp ON g.structure_id = sp.structure_id
AND r.position = sp.position
JOIN player p ON r.player_id = p.player_id
WHERE p.player_id = 17
GROUP BY p.name, e.date, e.event_id, sp.payout, s.buyin
ORDER BY p.name, e.date ASC
查询将运行。但是,结果有点不正确。原因是event 可以有多个游戏(具有不同的sp.payouts)。因此,如果用户在具有不同支出的事件中获得 2 个结果(即每个事件有 4 场比赛,用户从其中一场比赛中获得 20 英镑,从另一场比赛中获得 40 英镑),则上述内容会出现多行。
显而易见的解决方案是将GROUP BY 修改为:
GROUP BY p.name, e.date, e.event_id
但是,Postgres 对此抱怨,因为它似乎没有认识到 sp.payout 和 s.buyin 在聚合函数中。我得到了错误:
列“sp.payout”必须出现在 GROUP BY 子句中或用于 聚合函数
我在 Ubuntu Linux 服务器上运行 9.1。
我是否遗漏了什么,或者这可能是 Postgres 的真正缺陷?
【问题讨论】:
标签: sql postgresql aggregate-functions window-functions