私はTeradataを始めたばかりで、Teradataで「Rows unbounded previous」と呼ばれる順序付けられた分析関数に出会いました。この機能についていくつかのサイトを試しましたが、すべてのサイトで同じことを説明する複雑な例を使用しています。基本を明確にするために、素朴な例を提供してください。
これは、SQL標準の一部であり、Teradataを含む多くのデータベースに実装されているウィンドウ関数の「フレーム」または「範囲」句です。
簡単な例は、3日間のフレームで平均額を計算することです。例ではPostgreSQL構文を使用していますが、Teradataでも同じです。
WITH data (t, a) AS (
VALUES(1, 1),
(2, 5),
(3, 3),
(4, 5),
(5, 4),
(6, 11)
)
SELECT t, a, avg(a) OVER (ORDER BY t ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
FROM data
ORDER BY t
...結果は次のとおりです。
t a avg
----------
1 1 3.00
2 5 3.00
3 3 4.33
4 5 4.00
5 4 6.67
6 11 7.50
ご覧のとおり、各平均が計算されます"over"前の行(1 preceding
)と後続の行(1 following
)の間の範囲で構成される順序付きフレーム。
ROWS UNBOUNDED PRECEDING
を記述すると、フレームの下限は単純に無限になります。これは、たとえば、合計を計算するときに便利です(つまり、 "running totals" )。
WITH data (t, a) AS (
VALUES(1, 1),
(2, 5),
(3, 3),
(4, 5),
(5, 4),
(6, 11)
)
SELECT t, a, sum(a) OVER (ORDER BY t ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM data
ORDER BY t
降伏...
t a sum
---------
1 1 1
2 5 6
3 3 9
4 5 14
5 4 18
6 11 29
ROWS UNBOUNDED PRECEDING
はTeradata固有の構文ではなく、標準SQLです。 ORDER BY
とともに、結果が計算されるウィンドウを定義します。
論理的に、ウィンドウ集計関数は、開始行と終了行の間のすべての行に基づいて、PARTITION内の各行に対して新たに計算されます。
次のキーワードに基づいて、開始行と終了行が固定されているか、現在の行に対して相対的である場合があります。
可能な計算の種類は次のとおりです。
SUM(x) OVER (ORDER BY col ROWS UNBOUNDED PRECEDING)
は、累積合計または実行合計になります
11 -> 11
2 -> 11 + 2 = 13
3 -> 13 + 3 (or 11+2+3) = 16
44 -> 16 + 44 (or 11+2+3+44) = 60