PostgreSQL如何查询列累加和达到指定值的所有对应行记录
解决思路
核心逻辑是按时间升序取目标用户的所有入账记录(coins>0,负数为扣减记录无需参与抵扣计算),滚动计算累计入账金额,只要上一次的累计金额小于待消耗值,当前记录就需要纳入返回结果,直到累计金额覆盖待消耗值为止。
适配PostgreSQL的实现方案
你可以直接使用下面的SQL,将UUID42替换为目标用户ID,:consume_amount替换为实际要消耗的coins数值即可:
WITH running_cal AS ( SELECT id, coins, value, SUM(coins) OVER (ORDER BY created) AS running_total, COALESCE(LAG(SUM(coins)) OVER (ORDER BY created), 0) AS prev_running FROM t WHERE user_id = 'UUID42' AND coins > 0 ) SELECT id, coins, value FROM running_cal WHERE prev_running < :consume_amount;
效果验证
用你给出的测试场景验证:
- 消耗1coins:仅返回
UUID3,符合要求 - 消耗49coins:仅返回
UUID3,符合要求 - 消耗100coins:返回
UUID3、UUID5、UUID6,符合要求
如果需要兼容其他数据库,只需要调整窗口函数的语法即可,核心逻辑通用。
内容的提问来源于stack exchange,提问作者jeremywoertink
相关产品推荐
相关产品推荐

