按行数聚合值

Posted

技术标签:

【中文标题】按行数聚合值【英文标题】:Aggregate values by row count 【发布时间】:2012-10-25 22:02:23 【问题描述】:

我有一系列行,我需要将这些行中的值聚合到 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);

我真的很喜欢窗口函数!

【讨论】:

以上是关于按行数聚合值的主要内容,如果未能解决你的问题,请参考以下文章

1.表的聚合查询(和平均最大最小值)

postgres 按行聚合子集

MySQL的聚合函数

MySQL的聚合函数

第六期,聚合函数介绍!!!

第六期,聚合函数介绍!!!