按行数聚合值
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);
我真的很喜欢窗口函数!
【讨论】:
以上是关于按行数聚合值的主要内容,如果未能解决你的问题,请参考以下文章