2016-01-06 57 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

相關問題