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是一个变量,所以我不能使用连接。

4

1 回答 1

1

好吧,这可以通过使用框架和窗口函数来解决。

题目中的问题可以这样解决:

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);

我真的很喜欢窗口功能!

于 2012-10-25T22:41:16.713 回答