我有一系列行,我需要将这些行中的值聚合到N
元素组中,从当前行和N-1
后续行中累积值。
和N=3
数据是:
VALUES (1),(2),(3),(4),(5);
我想收到以下一组行(数组):
{1,2,3}
{2,3,4}
{3,4,5}
{4,5}
{5}
重要的是,这N
是一个变量,所以我不能使用连接。
我有一系列行,我需要将这些行中的值聚合到N
元素组中,从当前行和N-1
后续行中累积值。
和N=3
数据是:
VALUES (1),(2),(3),(4),(5);
我想收到以下一组行(数组):
{1,2,3}
{2,3,4}
{3,4,5}
{4,5}
{5}
重要的是,这N
是一个变量,所以我不能使用连接。
好吧,这可以通过使用框架和窗口函数来解决。
题目中的问题可以这样解决:
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);
我真的很喜欢窗口功能!