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
是一個變量,所以我不能使用連接。
我有一系列的行,我需要將這些行的值聚合到N
元素的組中,從當前行和N-1
後續行累加值。按行計算的聚合值
隨着N=3
和數據是:
VALUES (1),(2),(3),(4),(5);
我想收到以下的行集(陣列):
{1,2,3}
{2,3,4}
{3,4,5}
{4,5}
{5}
這一點很重要,即N
是一個變量,所以我不能使用連接。
那麼,這可以解決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);
我真的很喜歡窗口功能!