OLAP 指定

OLAP (On-Line Analytical Processing) 関数には、照会の結果の中で、 ランキング、行番号、および既存の集約関数情報をスカラー値で戻す機能があります。

OLAP-specification
Read syntax diagramSkip visual syntax diagramordered-OLAP-specificationnumbering-specificationaggregation-specification
ordered-OLAP-specification
Read syntax diagramSkip visual syntax diagramCUME_DIST ()PERCENT_RANK ()RANK ()DENSE_RANK ()NTILE( num-tiles)lag-functionlead-functionOVER( window-partition-clause window-order-clause)
lag-function
Read syntax diagramSkip visual syntax diagramLAG(expression ,offset,default-value,'RESPECT NULLS','IGNORE NULLS' )
lead-function
Read syntax diagramSkip visual syntax diagramLEAD(expression ,offset,default-value,'RESPECT NULLS','IGNORE NULLS' )
window-partition-clause
Read syntax diagramSkip visual syntax diagramPARTITION BY ,partitioning-expression
window-order-clause
Read syntax diagramSkip visual syntax diagramORDER BY,sort-key-expressionasc-optiondesc-optionORDER OFtable-designator
asc-option
Read syntax diagramSkip visual syntax diagramASC NULLS LASTNULLS FIRST
desc-option
Read syntax diagramSkip visual syntax diagramDESC NULLS FIRSTNULLS LAST
numbering-specification
Read syntax diagramSkip visual syntax diagramROW_NUMBER ()OVER( window-partition-clause window-order-clause )
aggregation-specification
Read syntax diagramSkip visual syntax diagram aggregate-function1OLAP-aggregate-function OVER(window-partition-clause RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWINGwindow-order-clauseRANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWwindow-aggregation-group-clause)
OLAP-aggregate-function
Read syntax diagramSkip visual syntax diagram first-value-functionlast-value-functionnth-value-functionratio-to-report-function
first-value-function
Read syntax diagramSkip visual syntax diagram FIRST_VALUE ( expression ,'RESPECT NULLS','IGNORE NULLS' )
last-value-function
Read syntax diagramSkip visual syntax diagram LAST_VALUE ( expression ,'RESPECT NULLS','IGNORE NULLS' )
nth-value-function
Read syntax diagramSkip visual syntax diagram NTH_VALUE ( expression , nth-row ) RESPECT NULLSIGNORE NULLS FROM FIRSTFROM LAST
ratio-to-report-function
Read syntax diagramSkip visual syntax diagramRATIO_TO_REPORT(expression )
window-aggregation-group-clause
Read syntax diagramSkip visual syntax diagramROWSRANGEgroup-startgroup-betweengroup-end
group-start
Read syntax diagramSkip visual syntax diagramUNBOUNDED PRECEDINGunsigned-constantPRECEDINGCURRENT ROW
group-between
Read syntax diagramSkip visual syntax diagramBETWEENgroup-bound1AND group-bound2
group-bound1
Read syntax diagramSkip visual syntax diagramUNBOUNDED PRECEDINGunsigned-constantPRECEDINGunsigned-constantFOLLOWINGCURRENT ROW
group-bound2
Read syntax diagramSkip visual syntax diagramUNBOUNDED FOLLOWINGunsigned-constantPRECEDINGunsigned-constantFOLLOWINGCURRENT ROW
group-end
Read syntax diagramSkip visual syntax diagramUNBOUNDED FOLLOWINGunsigned-constantFOLLOWING
Notes:
  • 1 ARRAY_AGG, CUME_DIST, and PERCENT_RANK are not supported as an aggregate function in aggregation-specification (SQLSTATE 42887).

OLAP 関数は、select-list の式、 または select-statement の ORDER BY 節に組み込むことができます (SQLSTATE 42903)。 OLAP 関数は、XMLQUERY または XMLEXISTS 式への引数内で使用することはできません (SQLSTATE 42903)。 OLAP 関数を集約関数の引数として使うことはできません (SQLSTATE 42607)。 OLAP 関数を適用したときの照会の結果は、その OLAP 関数の入った最も内側の副選択の結果表です。

OLAP 関数を指定するときには、関数を適用する行を定義したり、その順序を定義する枠が指定されます。 該当する行を集約関数とともに使用すると、その行をさらに詳細化して、 現在行との相対関係で、その前後の行範囲または行数として扱うことができます。 例えば、月単位のパーティションでは、直前の四半期の平均を計算することができます。

CUME_DIST 関数は、ある行の OLAP ウィンドウ内における累積分布 (0.0 から 1.0 までの値) を戻す分布関数です。 結果は次のように計算されます。
  • OLAP ウィンドウ内の現在行より前の行数 (現在行を含む) を、OLAP ウィンドウ内の行数で除算する。

結果のデータ・タイプは DECFLOAT(34) です。 結果が NULL 値になることはありません。

PERCENT_RANK 関数は、OLAP ウィンドウ内の行の相対パーセンタイル・ランク (0.0 から 1.0 までの値) を戻す分布関数です。 OLAP ウィンドウ内の行数が 1 より大きい場合、結果は次のように計算されます。
  • OLAP ウィンドウの現在行の RANK から 1 を引いたものを、OLAP ウィンドウ内の行数から 1 を引いたもので除算する。
それ以外の場合、結果は 0.0 です。

結果のデータ・タイプは DECFLOAT(34) です。 結果が NULL 値になることはありません。

ランキング関数は、枠内の行の序数ランクを計算します。 それぞれの枠内での順序がはっきりしていない行は、同位に割り当てられます。 ランキングの結果については、重複する値の結果の数値にギャップがあってもなくても定義できます。

RANK を指定すると、該当行に先行する行数に 1 を足した数で、行のランクが定義されます。 したがって、順序がはっきりしていない行が 2 行以上あると、 通しランク番号には、1 つ以上のギャップができます。

DENSE_RANK (または DENSERANK) を指定すると、順序の明確な先行行数に 1 を足して行のランクが定義されます。 したがって、通しランク番号にはギャップはありません。

ROW_NUMBER (または ROWNUMBER) 関数は、最初の行を 1 行目とする順序付けで定義された枠内の行の通し番号を計算します。 枠内で ORDER BY 節を指定していない場合、 (SELECT ステートメントの ORDER BY 節に基づくのではなく) 副選択で戻されたとおりに、 任意の順番で行に行番号が割り当てられます。

fetch-clause が ROW_NUMBER 関数と共に使用される場合、行番号が順序どおりに表示されないことがあります。 fetch-clause は、結果セット (ROW_NUMBER 割り当てを含む) が生成された後に適用されます。そのため、行番号の順序が結果セットの順序と同じでない場合、割り当てられた番号の一部がシーケンスから欠落することがあります。

RANK、DENSE_RANK、または ROW_NUMBER の結果のデータ・タイプは BIGINT です。 結果が NULL 値になることはありません。

NTILE 関数は、行の分位ランクを戻します。
数値タイル
分位の数を指定する式。 この式は、数値、CHAR、または VARCHAR の組み込みデータ・タイプの値を戻す必要があります。 Unicode データベースでは、 式は GRAPHIC または VARGRAPHIC のデータ・タイプにすることもできます。 CHAR、VARCHAR、GRAPHIC、および VARGRAPHIC は、暗黙的キャストを介してサポートされます。 SMALLINT、INTEGER、または BIGINT のいずれでもない式は、関数の評価の前に BIGINT にキャストされます。 値は 0 より大きくなければなりません (SQLSTATE 22014)。 この式は、定数、変数、または定数か変数のキャストでなければなりません (SQLSTATE 42601)。

暗黙的キャストが行われた後、NTILE の結果のデータ・タイプは、num-tiles のデータ・タイプと同じデータ・タイプになります。 引数が NULL になる可能性がある場合、結果も NULL になる可能性があります。 引数が NULL の場合、結果は NULL 値になります。

NTILE 関数は、OLAP ウィンドウ内の並べられた行を分位数 num-tiles 個に分割し、特定の行の分位ランクを計算して 1 から MIN(n, num-tiles) までの値を戻します。ここで、n は OLAP ウィンドウ内の行数です。 nnum-tiles で割り切れる場合、OLAP ウィンドウ内の行は、(n / num-tiles) 行ずつ含む、分位数 num-tiles 個の分位に分けられます。 割り切れない場合、1 から MOD(n, num-tiles) までの分位には、それぞれ (n / num-tiles + 1) 行が割り当てられ、(MOD(n, num-tiles) + 1) から num-tiles までの分位には、それぞれ (n / num-tiles) 行が割り当てられます。 結果は、現在行が相当する分位ランクです。

行を分位数に分割する際に、同じソート・キーは考慮されません。 同じソート・キーを持つ行は、それらのソート・キーの確定的でない順序に基づいて、別々の分位に割り当てられる可能性があります。 したがって、NTILE は決定論的な関数ではありません。

LAG 関数は、現在の行から offset 行前にある行の式の値を戻します。 offset は、正の整数定数でなければなりません (SQLSTATE 42815)。 0 の offset 値は、現在行を意味します。 window-partition-clause が指定されている場合、 offset とは現在のパーティションに含まれる、 現在の行から offset 行前のことです。 offset が指定されていない場合、値 1 が使用されます。 default-value (これは式であることが可能) が指定されている場合、 オフセットが現在のパーティションの有効範囲を超える場合にその値が戻されます。 指定されていない場合は、NULL 値が戻されます。 'IGNORE NULLS' が指定されている場合、行の式値が NULL 値であるすべての行は計算に算入されません。 'IGNORE NULLS' が指定されていて、すべての行が NULL の場合、 default-value (または default-value が指定されていない場合には NULL 値) が戻されます。

LEAD 関数は、現在の行から offset 行後にある行の式の値を戻します。 offset は、正の整数定数でなければなりません (SQLSTATE 42815)。 0 の offset 値は、現在行を意味します。 window-partition-clause が指定されている場合、 offset とは現在のパーティションに含まれる、 現在の行から offset 行後のことです。 offset が指定されていない場合、値 1 が使用されます。 default-value (これは式であることが可能) が指定されている場合、 オフセットが現在のパーティションの有効範囲を超える場合にその値が戻されます。 指定されていない場合は、NULL 値が戻されます。 'IGNORE NULLS' が指定されている場合、行の式値が NULL 値であるすべての行は計算に算入されません。 'IGNORE NULLS' が指定されていて、すべての行が NULL の場合、 default-value (または default-value が指定されていない場合には NULL 値) が戻されます。

FIRST_VALUE 関数は、OLAP ウィンドウ内の最初の行の式値を戻します。 'IGNORE NULLS' が指定されている場合、行の式値が NULL 値であるすべての行は計算に算入されません。 'IGNORE NULLS' が指定されていて、OLAP ウィンドウ内のすべての値が NULL の場合、 FIRST_VALUE は NULL 値を戻します。

LAST_VALUE 関数は、OLAP ウィンドウ内の最後の行の式の値を戻します。 'IGNORE NULLS' が指定されている場合、行の式値が NULL 値であるすべての行は計算に算入されません。 'IGNORE NULLS' が指定されていて、OLAP ウィンドウ内のすべての値が NULL の場合、 LAST_VALUE は NULL 値を戻します。

FIRST_VALUE、LAG、LAST_VALUE、および LEAD の結果のデータ・タイプは、 のデータ・タイプとなります。 結果は NULL 値の場合もあります。

NTH_VALUE 関数は、OLAP ウィンドウ内の nth-row 行の式の値を戻します。
expression
OLAP ウィンドウ内の現在行を指定する式。 式は組み込みデータ・タイプの値を戻す必要があります。(SQLSTATE 42884)。
n 行目
戻す OLAP ウィンドウの行を指定する式。 式は数値、CHAR、または VARCHAR の組み込みデータ・タイプの値を戻す必要があります。 Unicode データベースでは、 式は GRAPHIC または VARGRAPHIC のデータ・タイプにすることもできます。 CHAR、VARCHAR、GRAPHIC、および VARGRAPHIC は、暗黙的キャストを介してサポートされます。 SMALLINT、INTEGER、または BIGINT のいずれでもない式は、関数の評価の前に BIGINT にキャストされます。 値は 0 より大きくなければなりません (SQLSTATE 22016)。 この式は、定数、変数、または定数か変数のキャストでなければなりません (SQLSTATE 428I9)。
FROM FIRST または FROM LAST
nth-row の適用方法を指定します。 FROM FIRST を指定する場合、nth-row は、OLAP ウィンドウ内の最初の行から順方向にカウントするものとして扱われます。 FROM LAST を指定する場合、nth-row は、OLAP ウィンドウ内の最後の行から逆方向にカウントするものとして扱われます。
RESPECT NULLS または IGNORE NULLS
OLAP ウィンドウ内の NULL 値を処理する方法を指定します。 RESPECT NULLS を指定した場合、行の式値が NULL 値であるすべての行が計算に含められます。 IGNORE NULLS が指定されている場合、行の式値が NULL 値であるすべての行は計算に算入されません。

NTH_VALUE の結果のデータ・タイプは、expression のデータ・タイプと同じです。

結果は NULL 値の場合もあります。 nth-row が NULL の場合、結果は NULL 値です。 OLAP ウィンドウ内の行の数 (RESPECT NULLS を指定した場合は NULL 値を含み、IGNORE NULLS を指定した場合は NULL 値を除く) が nth-row の値未満の場合、結果は NULL 値です。

NTH_VALUE 関数は、非決定論的な関数です。window-order-clause が不要であり、window-order-clause を指定しても、同じソート・キーを持つ行の順序が確定的でないからです。

RATIO_TO_REPORT 関数は、OLAP パーティションにおける引数の合計と 1 つの引数の比率を返します。 例えば、以下の関数は同じことを意味します。
   RATIO_TO_REPORT(expression) OVER (...)
   CAST(expression AS DECFLOAT(34)) / SUM(expression) OVER(...) 
割り算は、常に DECFLOAT(34) を使用して実行されます。 結果のデータ・タイプは DECFLOAT(34) です。 引数が NULL になる可能性がある場合、結果も NULL になる可能性があります。 引数が NULL であれば、結果は NULL 値です。
PARTITION BY (パーティショニング式, ...)
関数を適用するときのパーティションを定義します。 partitioning-expression は、結果セットのパーティションを定義するときに使う式です。 partitioning-expression で参照されている各 column-name は、OLAP 仕様を含む副選択の結果表の列をはっきり参照するものでなければなりません (SQLSTATE 42702 または 42703)。 partitioning-expression には、スカラー全選択、XMLQUERY または XMLEXISTS 式 (SQLSTATE 42822)、決定論的でないか外部アクションを持つ関数または照会 (SQLSTATE 42845) を含めることはできません。
window-order-clause
ORDER BY (sort-key-expression, ...)
OLAP 関数の値、 または window-aggregation-group-clause の ROW 値の意味を決める、 パーティション内の行の順序を定義します (照会結果セットの順序を定義するものではありません)。
ソート・キー式
枠のパーティション内の行の順序を定義するのに使う式。 sort-key-expression で参照されている各 column-name は、OLAP 関数を含む副選択の結果セットの列をはっきり参照するものでなければなりません (SQLSTATE 42702 または 42703)。 sort-key-expression には、スカラー全選択、XMLQUERY または XMLEXISTS 式 (SQLSTATE 42822)、決定論的でないか外部アクションを持つ関数または照会 (SQLSTATE 42845) を含めることはできません。 この節は、RANK および DENSE_RANK 関数 (SQLSTATE 42601) で必要になります。
ASC
sort-key-expression の値を昇順に使用します。
DESC
sort-key-expression の値を降順に使用します。
NULLS FIRST
ウィンドウ配列において、ソート順序は、すべての非 NULL 値の前に NULL 値が置かれます。
NULLS LAST
ウィンドウ配列において、ソート順序は、すべての非 NULL 値の後に NULL 値が置かれます。
ORDER OF 表指定子
表指定子 で使用されているのと同じ順序付けを、副選択の結果表にも適用することを指定します。 この節を指定する副選択の FROM 節内には、表指定子 に一致する表参照がなければなりません (SQLSTATE 42703)。 適用される順序は、ネストされた副選択 (または全選択) 内の ORDER BY 節の列が外部副選択 (または全選択) に入っていた場合、およびそれらの列が ORDER OF 節の代わりに指定された場合と同じです。
window-aggregation-group-clause
行 R の集約グループは、(R のパーティションの行の順序付け内の) R に関連して定義されている行のセットです。 その節は集約グループを指定します。 この節が指定されない場合で、window-order-clause も指定されなければ、 集約グループはウィンドウ・パーティションのすべての行から構成されます。 このデフォルトは、RANGE (示したように) または ROWS を明示的に使用して指定できます。

window-order-clause が指定された場合、デフォルトの動作は window-aggregation-group-clause が指定されていない場合は異なります。 ウィンドウ集約グループは、window-order-clause によって定義されたウィンドウ・パーティションのウィンドウ順序付けで、R に先行する R のパーティションおよび R のピアである R のパーティションのすべての行で構成されます。

集約グループがカウント行によって定義されることを示します。
RANGE
集約グループがソート・キーからのオフセットによって定義されることを示します。
group-start
集約グループの開始点を指定します。 集約グループの終了は current row です。 group-start 節の仕様は、 "BETWEEN group-start AND CURRENT ROW" 形式の group-between 節と同じです。
group-between
ROWS または RANGE に基づいて、集約グループの開始および終了を指定します。
group-end
集約グループの終了点を指定します。 集約グループの開始は current row です。 group-end 節の仕様は、 "BETWEEN CURRENT ROW AND group-end" 形式の group-between 節と同じです。
UNBOUNDED PRECEDING
current row の前のパーティション全体を組み込みます。 これは、ROWS または RANGE のいずれかと一緒に指定できます。 window-order-clause 内の複数の sort-key-expressions と一緒に指定することもできます。
UNBOUNDED FOLLOWING
current row に続くパーティション全体を組み込みます。 これは、ROWS または RANGE のいずれかと一緒に指定できます。 window-order-clause 内の複数の sort-key-expressions と一緒に指定することもできます。
CURRENT ROW
current row に基づいて、集約グループの開始および終了を指定します。 ROWS が指定された場合、current row が集約グループ境界です。 RANGE が指定された場合、集約グループ境界には、 current row と同じ値を sort-key-expressions として持つ行のセットが組み込まれます。 group-bound1value FOLLOWING が指定されている場合、 この節を group-bound2 で指定することはできません。
unsigned-constant 先行
current row の前の行の範囲または行数のいずれかを指定します。 ROWS が指定された場合、unsigned-constant は行数を示す、ゼロまたは正の整数でなければなりません。 RANGE が指定された場合、unsigned-constant のデータ・タイプは、 window-order-clausesort-key-expression のタイプと互換性がなければなりません。 sort-key-expression は 1 つのみで、 sort-key-expression のデータ・タイプは減算を許可しなければなりません。 group-bound1 が CURRENT ROW または unsigned-constant FOLLOWING の場合、 この節を group-bound2 で指定することはできません。
符号なし定数 FOLLOWING
current row の後の行の範囲または行数のいずれかを指定します。 ROWS が指定された場合、unsigned-constant は行数を示す、ゼロまたは正の整数でなければなりません。 RANGE が指定された場合、unsigned-constant のデータ・タイプは、 window-order-clausesort-key-expression のタイプと互換性がなければなりません。 sort-key-expression は 1 つのみで、 sort-key-expression のデータ・タイプは加算を許可しなければなりません。

  1. 給与合計 (給与 + ボーナス) が $30,000 を超えている従業員のランキングを、 それぞれの給与合計に基づいて、姓の順に表示します。
       SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
           RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
         FROM EMPLOYEE WHERE SALARY+BONUS > 30000
         ORDER BY LASTNAME
    結果をランキング順に並べる場合、ORDER BY LASTNAME を以下のように置き換えます。
       ORDER BY RANK_SALARY
    または
       ORDER BY RANK() OVER (ORDER BY SALARY+BONUS DESC)
  2. それぞれの給与合計の平均に基づいて部門をランク付けします。
       SELECT WORKDEPT, AVG(SALARY+BONUS) AS AVG_TOTAL_SALARY,
           RANK() OVER (ORDER BY AVG(SALARY+BONUS) DESC) AS RANK_AVG_SAL
         FROM EMPLOYEE 
         GROUP BY WORKDEPT
         ORDER BY RANK_AVG_SAL
  3. それぞれの学歴に基づいて部門内で従業員をランク付けします。 部門内で同じランクの従業員が複数いた場合は、次のランキング値を増やさないようにします。
       SELECT WORKDEPT, EMPNO, LASTNAME, FIRSTNME, EDLEVEL,
           DENSE_RANK() OVER
             (PARTITION BY WORKDEPT ORDER BY EDLEVEL DESC) AS RANK_EDLEVEL
         FROM EMPLOYEE
         ORDER BY WORKDEPT, LASTNAME
  4. 照会の結果に行番号を示します。
       SELECT ROW_NUMBER() OVER (ORDER BY WORKDEPT, LASTNAME) AS NUMBER,
           LASTNAME, SALARY
         FROM EMPLOYEE
         ORDER BY WORKDEPT, LASTNAME
  5. 収入の多い上位 5 人をリストします。
       SELECT EMPNO, LASTNAME, FIRSTNME, TOTAL_SALARY, RANK_SALARY 
         FROM (SELECT EMPNO, LASTNAME, FIRSTNME, SALARY+BONUS AS TOTAL_SALARY,
           RANK() OVER (ORDER BY SALARY+BONUS DESC) AS RANK_SALARY
           FROM EMPLOYEE) AS RANKED_EMPLOYEE 
         WHERE RANK_SALARY < 6 
         ORDER BY RANK_SALARY
    ランクを WHERE 節で使うために、事前にそのランキングも含めた結果をまず計算するのに、ネストされた表の式が使われていることに注意してください。 共通表式も使われています。
  6. 部門ごとに、従業員の給与をリストして、 各人の給与がその部門で次に給与の高い従業員と比較してどれほど少ないかを示します。
       SELECT EMPNO, WORKDEPT, LASTNAME, FIRSTNME, JOB, SALARY,
           LEAD(SALARY, 1) OVER (PARTITION BY WORKDEPT
             ORDER BY SALARY) - SALARY AS DELTA_SALARY
         FROM EMPLOYEE
         ORDER BY WORKDEPT, SALARY
    
  7. 従業員の給与を、同じタイプの仕事のために最初に雇用された従業員との相対関係で計算します。
       SELECT JOB, HIREDATE, EMPNO, LASTNAME, FIRSTNME, SALARY,
           FIRST_VALUE(SALARY) OVER (PARTITION BY JOB
             ORDER BY HIREDATE) AS FIRST_SALARY,
           SALARY - FIRST_VALUE(SALARY) OVER (PARTITION BY JOB
             ORDER BY HIREDATE) AS DELTA_SALARY
         FROM EMPLOYEE
         ORDER BY JOB, HIREDATE
  8. 2006 年 1 月中の株式 XYZ の平均終値を計算します。 指定の日に株式が取り引きされなかった場合、DAILYSTOCKDATA 表でのその終値は NULL 値になります。 株式が取り引きされなかった日に対して NULL 値を戻す代わりに、 COALESCE 関数および LAG 関数を使用して、株式が取り引きされた直近の日付での終値を戻すようにします。 直前の非 NULL の終値を検索することを、2006 年 1 月から 1 カ月前に制限します。
       WITH V1(SYMBOL, TRADINGDATE, CLOSEPRICE) AS
       (
       SELECT SYMBOL, TRADINGDATE,
         COALESCE(CLOSEPRICE,
           LAG(CLOSEPRICE,
             1,
             CAST(NULL AS DECIMAL(8,2)),
             'IGNORE NULLS')
           OVER (PARTITION BY SYMBOL
           ORDER BY TRADINGDATE)
       )
       FROM DAILYSTOCKDATA
       WHERE SYMBOL = 'XYZ' AND
         TRADINGDATE BETWEEN '2005-12-01' AND '2006-01-31'
       )
       SELECT SYMBOL, AVG(CLOSEPRICE) AS AVG
         FROM V1
         WHERE TRADINGDATE BETWEEN '2006-01-01' AND '2006-01-31'
         GROUP BY SYMBOL
    
  9. 2005 年中の株式 ABC および XYZ の 30 日移動平均を計算します。
       WITH V1(SYMBOL, TRADINGDATE, MOVINGAVG30DAY) AS
       (
       SELECT SYMBOL, TRADINGDATE,
         AVG(CLOSEPRICE) OVER (PARTITION BY SYMBOL
           ORDER BY TRADINGDATE
         ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
       FROM DAILYSTOCKDATA
       WHERE SYMBOL IN ('ABC', 'XYZ')
         AND TRADINGDATE BETWEEN DATE('2005-01-01') - 2 MONTHS
           AND '2005-12-31'
       )
       SELECT SYMBOL, TRADINGDATE, MOVINGAVG30DAY
         FROM V1
         WHERE TRADINGDATE BETWEEN '2005-01-01' AND '2005-12-31'
         ORDER BY SYMBOL, TRADINGDATE
  10. カーソル位置を定義する式を使用して、その位置よりも 50 行前のスライディング・ウィンドウを照会します。
       SELECT DATE, FIRST_VALUE(CLOSEPRICE + 100) OVER
           (PARTITION BY SYMBOL
           ORDER BY DATE
           ROWS BETWEEN 50 PRECEDING AND 1 PRECEDING) AS FV
         FROM DAILYSTOCKDATA
         ORDER BY DATE
  11. それぞれの従業員について、特定の従業員より教育レベルが 1 低い、また 1 高い、同じ部署内の従業員を含む従業員のセットの平均給与を計算します。
       SELECT WORKDEPT, EDLEVEL, SALARY, AVG(SALARY)
             OVER (PARTITION BY WORKDEPT 
             ORDER BY EDLEVEL
             RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) 
          FROM EMPLOYEE 
          ORDER BY WORKDEPT, EDLEVEL
  12. 各従業員の給与の四分位数を計算します。
       SELECT EMPNO, SALARY, NTILE(4) OVER 
             (ORDER BY SALARY) AS QUARTILE
          FROM EMPLOYEE 
          ORDER BY SALARY
    結果セットは、次のとおりです。
    EMPNO  SALARY      QUARTILE
    ------ ----------- -----------
    200340    31840.00           1
    000290    35340.00           1
    200330    35370.00           1
    000310    35900.00           1
    200310    35900.00           1
    000280    36250.00           1
    000270    37380.00           1
    000300    37750.00           1
    200240    37760.00           1
    200120    39250.00           1
    000320    39950.00           1
    000230    42180.00           2
    000340    43840.00           2
    000170    44680.00           2
    000330    45370.00           2
    200280    46250.00           2
    200010    46500.00           2
    000260    47250.00           2
    000240    48760.00           2
    000250    49180.00           2
    000120    49250.00           2
    000220    49840.00           2
    000190    50450.00           3
    000180    51340.00           3
    000150    55280.00           3
    000200    57740.00           3
    000160    62250.00           3
    200170    64680.00           3
    000110    66500.00           3
    000210    68270.00           3
    000140    68420.00           3
    200140    68420.00           3
    200220    69840.00           4
    000060    72250.00           4
    000130    73800.00           4
    000050    80175.00           4
    000100    86150.00           4
    000090    89750.00           4
    000020    94250.00           4
    000070    96170.00           4
    000030    98250.00           4
    000010   152750.00           4
    
      42 record(s) selected.   
  13. 次の例の照会は、最高給与を基準にして行を 3 つのバケットに分けています。 各バケットに入る値を示すために、最高給与を含めています。
       SELECT NTILE(3) OVER (ORDER BY MAX_SALARY) AS Bucket, 
    MAX_SALARY FROM GOSALESDW.EMP_POSITION_DIM;
    照会の出力部分を次の表に示します。
    表 1. 出力例
    BUCKET MAX_SALARY
    1 0.00
    ... ...
    1 35000.00
    2 5000.00
    ... ...
    2 12000.00
    3 13000.00
    ... ...
    3 301500.00
  14. 部門内の各従業員の給与の累積分布と相対パーセンタイル・ランクを求めます。
       SELECT EMPNO, WORKDEPT, SALARY, 
          CAST(CUME_DIST() OVER (PARTITION BY WORKDEPT ORDER BY SALARY) AS DECIMAL(4,3))
             AS CUME_DIST, 
          CAST(PERCENT_RANK() OVER (PARTITION BY WORKDEPT ORDER BY SALARY) 
             AS DECIMAL(4,3)) 
             AS PERCENT_RANK FROM EMP 
          ORDER BY WORKDEPT, SALARY
    結果セットは、次のとおりです。
    EMPNO  WORKDEPT SALARY      CUME_DIST PERCENT_RANK
    ------ -------- ----------- --------- ------------
    200120 A00         39250.00     0.200        0.000
    200010 A00         46500.00     0.400        0.250
    000120 A00         49250.00     0.600        0.500
    000110 A00         66500.00     0.800        0.750
    000010 A00        152750.00     1.000        1.000
    000020 B01         94250.00     1.000        0.000
    000140 C01         68420.00     0.500        0.000
    200140 C01         68420.00     0.500        0.000
    000130 C01         73800.00     0.750        0.666
    000030 C01         98250.00     1.000        1.000
    000170 D11         44680.00     0.090        0.000
    000220 D11         49840.00     0.181        0.100
    000190 D11         50450.00     0.272        0.200
    000180 D11         51340.00     0.363        0.300
    000150 D11         55280.00     0.454        0.400
    000200 D11         57740.00     0.545        0.500
    000160 D11         62250.00     0.636        0.600
    200170 D11         64680.00     0.727        0.700
    000210 D11         68270.00     0.818        0.800
    200220 D11         69840.00     0.909        0.900
    000060 D11         72250.00     1.000        1.000
    000270 D21         37380.00     0.142        0.000
    200240 D21         37760.00     0.285        0.166
    000230 D21         42180.00     0.428        0.333
    000260 D21         47250.00     0.571        0.500
    000240 D21         48760.00     0.714        0.666
    000250 D21         49180.00     0.857        0.833
    000070 D21         96170.00     1.000        1.000
    000050 E01         80175.00     1.000        0.000
    000290 E11         35340.00     0.142        0.000
    000310 E11         35900.00     0.428        0.166
    200310 E11         35900.00     0.428        0.166
    000280 E11         36250.00     0.571        0.500
    000300 E11         37750.00     0.714        0.666
    200280 E11         46250.00     0.857        0.833
    000090 E11         89750.00     1.000        1.000
    200340 E21         31840.00     0.166        0.000
    200330 E21         35370.00     0.333        0.200
    000320 E21         39950.00     0.500        0.400
    000340 E21         43840.00     0.666        0.600
    000330 E21         45370.00     0.833        0.800
    000100 E21         86150.00     1.000        1.000
    
      42 record(s) selected.
  15. 各従業員の給与を、部門内の最高給与および 2 番目に高い給与と比較します。
          SELECT WORKDEPT, SALARY, FIRST_VALUE(SALARY) 
          OVER (PARTITION BY WORKDEPT ORDER BY SALARY DESC) AS FIRST, 
          NTH_VALUE(SALARY, 2) OVER (PARTITION BY WORKDEPT ORDER BY SALARY DESC) AS SECOND 
             FROM EMP 
             ORDER BY WORKDEPT, SALARY
    結果セットは、次のとおりです。
    WORKDEPT SALARY      FIRST       SECOND  
    -------- ----------- ----------- --------
    A00         39250.00   152750.00 66500.00
    A00         46500.00   152750.00 66500.00
    A00         49250.00   152750.00 66500.00
    A00         66500.00   152750.00 66500.00
    A00        152750.00   152750.00 66500.00
    B01         94250.00    94250.00 -
    C01         68420.00    98250.00 73800.00
    C01         68420.00    98250.00 73800.00
    C01         73800.00    98250.00 73800.00
    C01         98250.00    98250.00 73800.00
    D11         44680.00    72250.00 69840.00
    D11         49840.00    72250.00 69840.00
    D11         50450.00    72250.00 69840.00
    D11         51340.00    72250.00 69840.00
    D11         55280.00    72250.00 69840.00
    D11         57740.00    72250.00 69840.00
    D11         62250.00    72250.00 69840.00
    D11         64680.00    72250.00 69840.00
    D11         68270.00    72250.00 69840.00
    D11         69840.00    72250.00 69840.00
    D11         72250.00    72250.00 69840.00
    D21         37380.00    96170.00 49180.00
    D21         37760.00    96170.00 49180.00
    D21         42180.00    96170.00 49180.00
    D21         47250.00    96170.00 49180.00
    D21         48760.00    96170.00 49180.00
    D21         49180.00    96170.00 49180.00
    D21         96170.00    96170.00 49180.00
    E01         80175.00    80175.00 -
    E11         35340.00    89750.00 46250.00
    E11         35900.00    89750.00 46250.00
    E11         35900.00    89750.00 46250.00
    E11         36250.00    89750.00 46250.00
    E11         37750.00    89750.00 46250.00
    E11         46250.00    89750.00 46250.00
    E11         89750.00    89750.00 46250.00
    E21         31840.00    86150.00 45370.00
    E21         35370.00    86150.00 45370.00
    E21         39950.00    86150.00 45370.00
    E21         43840.00    86150.00 45370.00
    E21         45370.00    86150.00 45370.00
    E21         86150.00    86150.00 45370.00
    
      42 record(s) selected.