一連の行があり、これらの行の値を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);
ウィンドウ関数が大好きです!