如何使用窗口函数引用输出行?

时间:2016-01-06 18:36:49

标签: postgresql

假设我有一个包含quantity列的表格。

CREATE TABLE transfers (
  user_id integer,
  quantity integer,
  created timestamp default now()
);

我希望使用窗口函数迭代地通过分区,但访问输出行,而不是输入表行。

要访问输入表行,我可以这样做:

SELECT LAG(quantity, 1, 0)
  OVER (PARTITION BY user_id ORDER BY created)
FROM transfers;

我需要访问上一个输出行来计算下一个输出行。如何访问输出中的滞后行?类似的东西:

CREATE VIEW balance AS
SELECT LAG(balance.total, 1, 0) + quantity AS total
  OVER (PARTITION BY user_id ORDER BY created)
FROM transfers;

修改

这是一个支持如何访问窗口分区中上一个输出行的问题的最小示例。我实际上并不想要一笔钱。

2 个答案:

答案 0 :(得分:0)

您似乎尝试计算Shape。幸运的是,这正是running sum窗函数的作用:

Sum()

答案 1 :(得分:0)

我想,看看这个问题,你唯一需要的就是计算累积金额 要计算累积总和,请使用以下查询:

SELECT *,
      SUM( CASE WHEN quantity IS NULL THEN 0 ELSE quantity END) 
      OVER ( PARTITION BY user_id ORDER BY created
             ROWS BETWEEN unbounded preceding AND current row
              ) As cumulative_sum
FROM transfers
ORDER BY user_id, created
;

但是如果你想要更复杂的计算,特别是包含某些依赖于prevoius行结果的条件(决策),那么你需要一个递归方法。