web-dev-qa-db-ja.com

Teradataで使用されるROWS UNBOUNDED PRECEDINGとは何ですか?

私はTeradataを始めたばかりで、Teradataで「Rows unbounded previous」と呼ばれる順序付けられた分析関数に出会いました。この機能についていくつかのサイトを試しましたが、すべてのサイトで同じことを説明する複雑な例を使用しています。基本を明確にするために、素朴な例を提供してください。

32
StrugglingCoder

これは、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

SQLウィンドウ関数の別の非常に優れた説明

75
Lukas Eder

ROWS UNBOUNDED PRECEDINGはTeradata固有の構文ではなく、標準SQLです。 ORDER BYとともに、結果が計算されるウィンドウを定義します。

論理的に、ウィンドウ集計関数は、開始行と終了行の間のすべての行に基づいて、PARTITION内の各行に対して新たに計算されます。

次のキーワードに基づいて、開始行と終了行が固定されているか、現在の行に対して相対的である場合があります。

  • UNBOUNDED PRECEDING、現在の行の前のすべての行->修正済み
  • UNBOUNDED FOLLOWING、現在の行の後のすべての行->修正済み
  • x PRECEDING、現在の行のx行前->相対
  • y FOLLOWING、現在の行の後のy行->相対

可能な計算の種類は次のとおりです。

  • 開始行と終了行の両方が固定され、ウィンドウはパーティションのすべての行で構成されます。グループ合計、つまり集計と詳細行
  • 一方の端は固定され、もう一方の端は現在の行に対して相対的であり、行の数は増減します。現在の合計、残りの合計
  • 開始行と終了行は現在の行に相対的であり、ウィンドウ内の行の数は固定されています。 n行にわたる移動平均

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
41
dnoeth