2016-01-06 61 views
0

假设我有一个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; 

编辑

这是一个最小的例子来支持如何窗口分区中访问先前输出行的问题。我其实不想要一笔钱。

回答

0

看来你试图计算一个running sum。幸运的是,这正是Sum()窗函数的作用:

WITH transfers AS(
    SELECT i, random()-0.3 AS quantity FROM generate_series(1,100) as i 
) 
SELECT i, quantity, sum(quantity) OVER (ORDER BY i) from transfers; 
+0

这只是一个例子,我想在case语句和计算中使用之前的输出行。 – AJcodez

0

我猜,看问题,你需要的仅仅是计算累计总和。
要计算累计SUMM使用此查询:

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行结果的条件(决定),那么你需要一个递归方法。

+0

是的,这只是一个例子,我需要做花哨的东西。 – AJcodez

相关问题