2012-10-25 84 views
1

我有一系列的行,我需要將這些行的值聚合到N元素的組中,從當前行和N-1後續行累加值。按行計算的聚合值

隨着N=3和數據是:

VALUES (1),(2),(3),(4),(5); 

我想收到以下的行集(陣列):

{1,2,3} 
{2,3,4} 
{3,4,5} 
{4,5} 
{5} 

這一點很重要,即N是一個變量,所以我不能使用連接。

回答

1

那麼,這可以解決using frames together with window functions

所處理的問題是可以解決這樣的:

WITH v(v) AS (VALUES (1),(2),(3),(4),(5)) 
SELECT v, 
     array_agg(v) OVER (ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS arr 
    FROM v; 

而下面的例子說明如何獲得完整陣列的列表,即消除那些不包含所有N條目:

WITH cnt(c) AS (SELECT 3), 
    val(v) AS (VALUES (1),(2),(3),(4),(5)), 
    arr AS 
(SELECT v, 
     array_agg(v) OVER (ROWS BETWEEN CURRENT ROW 
          AND (SELECT c-1 FROM cnt) FOLLOWING) AS arr 
    FROM val) 
SELECT v,arr 
    FROM arr 
WHERE array_upper(arr,1) = (SELECT c FROM cnt); 

我真的很喜歡窗口功能!