すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:ウィンドウ関数

最終更新日:Mar 27, 2025

ウィンドウ関数を使用して、ウィンドウ内の指定された列のデータを柔軟に分析および処理できます。このトピックでは、開発を容易にするために、SQL分析機能でサポートされているウィンドウ関数の構文、パラメーター、および例について説明します。

次の表に、SQL分析機能でサポートされているウィンドウ関数を示します。

関数

説明

AVG

ウィンドウ内のデータの平均値を計算します。

CLUSTER_SAMPLE

データのランダムな行をサンプリングします。true が返された場合、指定されたデータ行がサンプリングされます。

COUNT

ウィンドウ内の行数を計算します。

CUME_DIST

パーティション内のデータの累積分布を計算します。

DENSE_RANK

行のグループ内の行のランクを計算します。ランクは連続しています。

FIRST_VALUE

現在の行が属するウィンドウの最初のデータ行の計算結果を取得します。

LAG

ウィンドウ内の指定されたオフセットで現在の行の前にある N 番目のデータ行の計算結果を取得します。

LAST_VALUE

現在の行が属するウィンドウの最後のデータ行の計算結果を取得します。

LEAD

ウィンドウ内の指定されたオフセットで現在の行に続く N 番目のデータ行の計算結果を取得します。

MAX

ウィンドウ内の最大値を計算します。

MEDIAN

ウィンドウ内の中央値を計算します。

MIN

ウィンドウ内の最小値を計算します。

NTILE

パーティション内のデータ行を同じサイズの N 個のグループに分割し、現在の行が属するグループの番号を返します。グループ番号の範囲は 1 ~ N です。

NTH_VALUE

現在の行が属するウィンドウの N 番目のデータ行の計算結果を取得します。

PERCENT_RANK

順序付けられた行のグループ内の行のパーセンタイルランクを計算します。この関数はパーセント値を返します。

RANK

順序付けられた行のグループ内の行のランクを計算します。ランクは連続した整数ではない場合があります。

ROW_NUMBER

行のシーケンス番号を計算します。行番号は 1 から始まります。

STDDEV

すべての入力値の母集団標準偏差を返します。この関数は STDDEV_POP とも呼ばれます。

STDDEV_SAMP

すべての入力値の標本標準偏差を返します。

SUM

ウィンドウ内のデータの合計を計算します。

制限事項

ウィンドウ関数を使用する前に、次の制限事項に注意してください。

  • ウィンドウ関数は SELECT 文でのみサポートされています。

  • ウィンドウ関数には、ネストされたウィンドウ関数またはネストされた集約関数を含めることはできません。

  • ウィンドウ関数と、同じレベルの集約関数を一緒に使用することはできません。

構文

ウィンドウ関数の構文:

<function_name>([distinct][<expression> [, ...]]) over (<window_definition>)
<function_name>([distinct][<expression> [, ...]]) over <window_name>
  • function_name: 組み込みウィンドウ関数の名前。

  • expression: ウィンドウ関数の形式。形式は関数の構文によって異なります。

  • windowing_definition: ウィンドウの定義。 windowing_definition の構文については、windowing_definition をご参照ください。

  • window_name: ウィンドウの名前。 window キーワードを使用してウィンドウを設定し、windowing_definition を使用してウィンドウの名前を指定できます。 named_window_def の構文:

    window <window_name> as (<window_definition>)

    SQL 文における named_window_def の位置:

    select ... from ... [where ...] [group by ...] [having ...] named_window_def [order by ...] [limit ...]

windowing_definition

構文

--partition_clause:
[partition by <expression> [, ...]]
--orderby_clause:
[order by <expression> [asc|desc][nulls {first|last}] [, ...]]
[<frame_clause>]

SELECT 文でウィンドウ関数を使用する場合、ウィンドウ関数が実行されるときに、windowing_definition の PARTITION BY および ORDER BY に基づいてデータがパーティション化およびソートされます。SELECT 文に partition by が含まれていない場合は、パーティションは 1 つだけで、そのパーティションにはすべてのデータが含まれます。SELECT 文に order by が含まれていない場合、パーティション内のデータはランダムな順序で配置され、データストリームが生成されます。データストリームが生成された後、windowing_definition の frame_clause に基づいてデータストリームから行のグループが抽出され、現在の行のウィンドウが作成されます。ウィンドウ関数は、現在の行が属するウィンドウに含まれるデータを計算します。

  • partition by <expression> [, ...]: オプション。このパラメーターは、パーティション情報を指定します。パーティションキー列の値が行のグループで同じである場合、これらの行は同じウィンドウに含まれます。PARTITION BY の形式の詳細については、「テーブル操作」をご参照ください。

  • order by <expression> [asc|desc][nulls {first|last}] [, ...]: オプション。このパラメーターは、ウィンドウ内のデータ行のソート方法を指定します。

    説明

    order by で指定された列の値が同じ場合、ソート結果は正確でない可能性があります。order by で指定された列の値が一意になるようにすることで、データのランダムな順序付けを減らすことができます。

  • frame_clause: オプション。このパラメーターは、ウィンドウのデータ境界を決定するために使用されます。frame_clause の詳細については、「frame_clause」をご参照ください。

frame_clause

構文

-- 構文 1
{ROWS|RANGE|GROUPS} <frame_start> [<frame_exclusion>]
-- 構文 2
{ROWS|RANGE|GROUPS} between <frame_start> and <frame_end> [<frame_exclusion>]

frame_clause は、ウィンドウのデータ境界を決定するために使用される閉区間です。データ境界は、frame_startframe_end で指定された行に基づいて決定されます。

  • ROWS|RANGE|GROUPS: 必須。ROWS、RANGE、および GROUPS は、frame_clause のタイプを示します。frame_startframe_end の実装ルールは、frame_clause のタイプによって異なります。説明:

    • ROWS: ウィンドウのデータ境界は、行数に基づいて決定されます。

    • RANGE: ウィンドウのデータ境界は、order by で指定された列の値の比較結果に基づいて決定されます。ほとんどの場合、order by は windowing_definition で指定されます。order by が windowing_definition で指定されていない場合、order by で指定された列の値は、パーティション内のすべての行で同じです。NULL 値は同等と見なされます。

    • グループ: パーティションでは、order by で指定された列の値が同じ行がグループを形成します。order by が指定されていない場合、パーティション内のすべての行が 1 つのグループを形成します。NULL 値は同等と見なされます。

  • frame_startframe_end: ウィンドウの開始行と終了行。frame_start は必須です。frame_end はオプションです。frame_end が指定されていない場合は、デフォルト値の CURRENT ROW が使用されます。

    frame_start で指定された行は、frame_end で指定された行よりも前であるか、同じである必要があります。 で指定された行と比較して、frame_start で指定された行は、windowing_definition の order by で指定された列に基づいてウィンドウ内のすべてのデータがソートされた後、ウィンドウ内の最初の行に近くなります。次の表に、frame_clause のタイプが ROWS、RANGE、または GROUPS の場合の frame_start と frame_end の有効な値とロジックを示します。

    frame_clause タイプ

    frame_start または frame_end の値

    説明

    ROWS、RANGE、および GROUPS

    UNBOUNDED PRECEDING

    パーティションの最初の行を示します。行は 1 からカウントされます。

    UNBOUNDED FOLLOWING

    パーティションの最後の行を示します。

    ROWS

    CURRENT ROW

    現在の行を示します。データの各行は、ウィンドウ関数によって計算された結果に対応します。現在の行は、ウィンドウ関数を使用してデータが計算される行です。

    offset PRECEDING

    指定された offset で現在の行よりも前にある N 番目の行を示します。たとえば、0 PRECEDING が現在の行を示す場合、1 PRECEDING は前の行を示します。offset は負でない整数である必要があります。

    offset FOLLOWING

    指定された offset にある現在の行の後にある N 番目の行を示します。たとえば、0 FOLLOWING が現在の行を示す場合、1 FOLLOWING は次の行を示します。offset は非負の整数である必要があります。

    RANGE

    CURRENT ROW

    • frame_start が CURRENT ROW に設定されている場合、order by で指定された列と同じ値を持つ最初の行が現在の行として使用されます。

    • frame_end が CURRENT ROW に設定されている場合、order by で指定された列と同じ値を持つ最後の行が現在の行として使用されます。

    offset PRECEDING

    frame_start および frame_end で指定された行は、order by で指定されたソート順に基づいて決定されます。たとえば、ウィンドウ内のデータが X でソートされている場合、Xi は i 番目の行に対応する X 値を指定し、Xc は現在の行に対応する X 値を指定します。frame_start および frame_end で指定された行の位置:

    • order by が asc に設定されています:

      • frame_start は、Xc - Xi ≤ offset という要件を満たす最初の行を指定します。

      • frame_end は、Xc - Xi ≥ offset という要件を満たす最後の行を指定します。

    • order by が desc に設定されています:

      • frame_start は、Xi - Xc ≤ offset という要件を満たす最初の行を指定します。

      • frame_end は、次の要件を満たす最後の行を指定します。Xi - Xc ≥ offset

    order by で指定された列は、次のデータ型を使用できます:TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、DATETIME、DATE、および TIMESTAMP。

    offset を DATE 型で使用する場合の構文:

    • N: N 日または N 秒を示します。非負の整数である必要があります。 DATETIME 型または TIMESTAMP 型のオフセットの場合、N は N 秒です。 DATE 型のオフセットの場合、N は N 日です。

    • interval 'N' {YEAR\MONTH\DAY\HOUR\MINUTE\SECOND}: N 年、月、日、時、分、または秒を示します。たとえば、INTERVAL '3' YEAR は 3 年を示します。

    • INTERVAL 'N-M' YEAR TO MONTH: N 年 M か月を示します。たとえば、INTERVAL '1-3' YEAR TO MONTH は 1 年 3 か月を示します。

    • INTERVAL 'D[ H[:M[:S[:N]]]]' DAY TO SECOND: D 日、H 時間、M 分、S 秒、および N ナノ秒を示します。たとえば、INTERVAL '1 2:3:4:5' DAY TO SECOND は、1 日 2 時間 3 分 4 秒 5 ナノ秒を示します。

    offset FOLLOWING

    frame_start および frame_end で指定された行は、order by で指定されたソート順に基づいて決定されます。たとえば、ウィンドウ内のデータが X でソートされている場合、Xi は i 番目の行に対応する X 値を指定し、Xc は現在の行に対応する X 値を指定します。frame_start および frame_end で指定された行の位置:

    • order by が asc に設定されています:

      • frame_start は、Xi - Xc ≥ offset という要件を満たす最初の行を指定します。

      • frame_end は、Xi - Xc ≤ offset という要件を満たす最後の行を指定します。

    • order by が desc に設定されています:

      • frame_start は、次の要件を満たす最初の行を指定します。Xc - Xi >= offset

      • frame_end は、Xc - Xi <= offset という要件を満たす最後の行を指定します。

    GROUPS

    CURRENT ROW

    • frame_start が CURRENT ROW に設定されている場合、現在の行が属するグループの最初の行が使用されます。

    • frame_end が CURRENT ROW に設定されている場合、現在の行が属するグループの最後の行が使用されます。

    offset PRECEDING

    • frame_start がオフセット PRECEDING に設定されている場合、指定された offset で現在の行のグループよりも前にある N 番目のグループの最初の行が使用されます。

    • frame_end がオフセット PRECEDING に設定されている場合、指定された offset で現在の行のグループよりも前にある N 番目のグループの最後の行が使用されます。

    説明

    frame_start を UNBOUNDED FOLLOWING に設定することはできず、frame_end を UNBOUNED PRECEDING に設定することはできません。

    offset FOLLOWING

    • frame_start がオフセット FOLLOWING に設定されている場合、指定された offset で現在の行のグループに続く N 番目のグループの最初の行が使用されます。

    • frame_end が FOLLOWING オフセットに設定されている場合、指定された offset で現在の行のグループに続く N 番目のグループの最後の行が使用されます。

    説明

    frame_start を UNBOUNDED FOLLOWING に設定することはできず、frame_end を UNBOUNED PRECEDING に設定することはできません。

  • frame_exclusion: オプション。このパラメーターは、ウィンドウから特定の行を削除するために使用されます。有効な値:

    • EXCLUDE NO OTHERS: ウィンドウから行は除外されません。

    • EXCLUDE CURRENT ROW: 現在の行はウィンドウから除外されます。

    • EXCLUDE GROUP: パーティション内の行のグループ全体がウィンドウから除外されることを示します。グループ内では、すべての行が、現在の行として order by で指定された列と同じ値を持ちます。

    • EXCLUDE TIES: 現在の行を除く、行のグループ全体がウィンドウから除外されます。

デフォルトの frame_clause

frame_clause を設定しない場合、frame_clause のデフォルト値は次の形式になります。この形式は、ほとんどの SQL ベースのシステムで使用される形式と同じです。

  • RANGE between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE NO OTHERS

ウィンドウのデータ境界の例

この例では、tbl という名前のテーブルに、BIGINT 型の 3 つの列 pid、oid、および rid が含まれています。tbl テーブルには、次のデータが含まれています。

+------------+------------+------------+
| pid        | oid        | rid        |
+------------+------------+------------+
| 1          | NULL       | 1          |
| 1          | NULL       | 2          |
| 1          | 1          | 3          |
| 1          | 1          | 4          |
| 1          | 2          | 5          |
| 1          | 4          | 6          |
| 1          | 7          | 7          |
| 1          | 11         | 8          |
| 2          | NULL       | 9          |
| 2          | NULL       | 10         |
+------------+------------+------------+

次の SQL 文の省略記号(...)を windowing_definition に置き換えて、各データ行が含まれるウィンドウにデータを表示できます。

説明

返された結果の window 列の値が NULL の場合、ウィンドウにはデータが含まれていません。

  • ROWS モードのウィンドウ

    • windowing_definition 1

      partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW
      -- SQL 文の例:
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by 
      oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | [1]    |
      | 1          | NULL       | 2          | [1, 2] |
      | 1          | 1          | 3          | [1, 2, 3] |
      | 1          | 1          | 4          | [1, 2, 3, 4] |
      | 1          | 2          | 5          | [1, 2, 3, 4, 5] |
      | 1          | 4          | 6          | [1, 2, 3, 4, 5, 6] |
      | 1          | 7          | 7          | [1, 2, 3, 4, 5, 6, 7] |
      | 1          | 11         | 8          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 2          | NULL       | 9          | [9]    |
      | 2          | NULL       | 10         | [9, 10] |
      +------------+------------+------------+--------+
    • windowing_definition 2

      partition by pid order by oid ROWS between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
      -- SQL 文の例:
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by 
      oid ROWS between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | NULL       | 2          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | 1          | 3          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | 1          | 4          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | 2          | 5          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | 4          | 6          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | 7          | 7          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | 11         | 8          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 2          | NULL       | 9          | [9, 10] |
      | 2          | NULL       | 10         | [9, 10] |
      +------------+------------+------------+--------+
    • windowing_definition 3

      partition by pid order by oid ROWS between 1 FOLLOWING and 3 FOLLOWING
      -- SQL 文の例:
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by 
      oid ROWS between 1 FOLLOWING and 3 FOLLOWING) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | [2, 3, 4] |
      | 1          | NULL       | 2          | [3, 4, 5] |
      | 1          | 1          | 3          | [4, 5, 6] |
      | 1          | 1          | 4          | [5, 6, 7] |
      | 1          | 2          | 5          | [6, 7, 8] |
      | 1          | 4          | 6          | [7, 8] |
      | 1          | 7          | 7          | [8]    |
      | 1          | 11         | 8          | NULL   |
      | 2          | NULL       | 9          | [10]   |
      | 2          | NULL       | 10         | NULL   |
      +------------+------------+------------+--------+
    • windowing_definition 4

      partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE CURRENT ROW
      -- SQL 文の例:
      select pid, 
      oid, 
      rid, 
      collect_list(rid) over(partition by pid order by 
      oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE CURRENT ROW) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | NULL   |
      | 1          | NULL       | 2          | [1]    |
      | 1          | 1          | 3          | [1, 2] |
      | 1          | 1          | 4          | [1, 2, 3] |
      | 1          | 2          | 5          | [1, 2, 3, 4] |
      | 1          | 4          | 6          | [1, 2, 3, 4, 5] |
      | 1          | 7          | 7          | [1, 2, 3, 4, 5, 6] |
      | 1          | 11         | 8          | [1, 2, 3, 4, 5, 6, 7] |
      | 2          | NULL       | 9          | NULL   |
      | 2          | NULL       | 10         | [9]    |
      +------------+------------+------------+--------+
    • windowing_definition 5

      partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE GROUP
      -- SQL 文の例:
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE GROUP) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | NULL   |
      | 1          | NULL       | 2          | NULL   |
      | 1          | 1          | 3          | [1, 2] |
      | 1          | 1          | 4          | [1, 2] |
      | 1          | 2          | 5          | [1, 2, 3, 4] |
      | 1          | 4          | 6          | [1, 2, 3, 4, 5] |
      | 1          | 7          | 7          | [1, 2, 3, 4, 5, 6] |
      | 1          | 11         | 8          | [1, 2, 3, 4, 5, 6, 7] |
      | 2          | NULL       | 9          | NULL   |
      | 2          | NULL       | 10         | NULL   |
      +------------+------------+------------+--------+
    • windowing_definition 6

      partition by pid order by oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE TIES
      -- SQL 文の例:
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by 
      oid ROWS between UNBOUNDED PRECEDING and CURRENT ROW EXCLUDE TIES) as window from tbl;                            

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | [1]    |
      | 1          | NULL       | 2          | [2]    |
      | 1          | 1          | 3          | [1, 2, 3] |
      | 1          | 1          | 4          | [1, 2, 4] |
      | 1          | 2          | 5          | [1, 2, 3, 4, 5] |
      | 1          | 4          | 6          | [1, 2, 3, 4, 5, 6] |
      | 1          | 7          | 7          | [1, 2, 3, 4, 5, 6, 7] |
      | 1          | 11         | 8          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 2          | NULL       | 9          | [9]    |
      | 2          | NULL       | 10         | [10]   |
      +------------+------------+------------+--------+

      EXCLUDE CURRENT ROW と EXCLUDE GROUP の違いは、windowing_definition 5 と windowing_definition 6 において、window 列の値が 2、4、および 10 である行と、rid 列の値を比較することで確認できます。 frame_exclusion が EXCLUDE GROUP に設定されている場合、現在の行と同じ oid 列の値を持つ行が存在する場合、パーティション内で同じ pid 列の値を持つ行が抽出されます。

  • RANGE モードのウィンドウ

    • windowing_definition 1

      partition by pid order by oid RANGE between UNBOUNDED PRECEDING and CURRENT ROW
      -- SQL 文の例:
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by 
      oid RANGE between UNBOUNDED PRECEDING and CURRENT ROW) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | [1, 2] |
      | 1          | NULL       | 2          | [1, 2] |
      | 1          | 1          | 3          | [1, 2, 3, 4] |
      | 1          | 1          | 4          | [1, 2, 3, 4] |
      | 1          | 2          | 5          | [1, 2, 3, 4, 5] |
      | 1          | 4          | 6          | [1, 2, 3, 4, 5, 6] |
      | 1          | 7          | 7          | [1, 2, 3, 4, 5, 6, 7] |
      | 1          | 11         | 8          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 2          | NULL       | 9          | [9, 10] |
      | 2          | NULL       | 10         | [9, 10] |
      +------------+------------+------------+--------+

      frame_end が CURRENT ROW に設定されている場合、現在の行と同じ oid 列の値を持ち、order by で指定された順序で最後の行が取得されます。したがって、rid 列の値が 1 である行の window 列の値は [1, 2] です。

    • windowing_definition 2

      partition by pid order by oid RANGE between CURRENT ROW and UNBOUNDED FOLLOWING
      -- SQL 文の例:
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by 
      oid RANGE between CURRENT ROW and UNBOUNDED FOLLOWING) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | NULL       | 2          | [1, 2, 3, 4, 5, 6, 7, 8] |
      | 1          | 1          | 3          | [3, 4, 5, 6, 7, 8] |
      | 1          | 1          | 4          | [3, 4, 5, 6, 7, 8] |
      | 1          | 2          | 5          | [5, 6, 7, 8] |
      | 1          | 4          | 6          | [6, 7, 8] |
      | 1          | 7          | 7          | [7, 8] |
      | 1          | 11         | 8          | [8]    |
      | 2          | NULL       | 9          | [9, 10] |
      | 2          | NULL       | 10         | [9, 10] |
      +------------+------------+------------+--------+
    • windowing_definition 3

      partition by pid order by oid RANGE between 3 PRECEDING and 1 PRECEDING
      -- SQL 文の例:
      
      select pid, 
             oid, 
             rid, 
      collect_list(rid) over(partition by pid order by 
      oid RANGE between 3 PRECEDING and 1 PRECEDING) as window from tbl;

      結果の例:

      +------------+------------+------------+--------+
      | pid        | oid        | rid        | window |
      +------------+------------+------------+--------+
      | 1          | NULL       | 1          | [1, 2] |
      | 1          | NULL       | 2          | [1, 2] |
      | 1          | 1          | 3          | NULL   |
      | 1          | 1          | 4          | NULL   |
      | 1          | 2          | 5          | [3, 4] |
      | 1          | 4          | 6          | [3, 4, 5] |
      | 1          | 7          | 7          | [6]    |
      | 1          | 11         | 8          | NULL   |
      | 2          | NULL       | 9          | [9, 10] |
      | 2          | NULL       | 10         | [9, 10] |
      +------------+------------+------------+--------+

      oid の値が order by で NULL である行の場合、frame_startoffset PRECEDING または offset FOLLOWING に設定されている場合、その行は order by で oid の値が NULL である最初の行になります(ただし、offset が unbounded でない場合)。 frame_end が offset PRECEDING または offset FOLLOWING に設定されている場合、その行は order by で oid の値が NULL である最後の行になります(ただし、offset が unbounded でない場合)。

  • GROUPS モードのウィンドウ

    windowing_definition

    partition by pid order by oid GROUPS between 2 PRECEDING and CURRENT ROW
    -- SQL 文の例:
    select pid, 
           oid, 
           rid, 
    collect_list(rid) over(partition by pid order by 
    oid GROUPS between 2 PRECEDING and CURRENT ROW) as window from tbl;

    結果の例:

    +------------+------------+------------+--------+
    | pid        | oid        | rid        | window |
    +------------+------------+------------+--------+
    | 1          | NULL       | 1          | [1, 2] |
    | 1          | NULL       | 2          | [1, 2] |
    | 1          | 1          | 3          | [1, 2, 3, 4] |
    | 1          | 1          | 4          | [1, 2, 3, 4] |
    | 1          | 2          | 5          | [1, 2, 3, 4, 5] |
    | 1          | 4          | 6          | [3, 4, 5, 6] |
    | 1          | 7          | 7          | [5, 6, 7] |
    | 1          | 11         | 8          | [6, 7, 8] |
    | 2          | NULL       | 9          | [9, 10] |
    | 2          | NULL       | 10         | [9, 10] |
    +------------+------------+------------+--------+

サンプルデータ

このセクションでは、関数の使用方法を理解するためのサンプルソースデータと例を提供します。emp という名前のテーブルを作成し、サンプルデータをテーブルに挿入します。ステートメントの例:

create table if not exists emp
   (empno bigint,
    ename string,
    job string,
    mgr bigint,
    hiredate datetime,
    sal bigint,
    comm bigint,
    deptno bigint);
tunnel upload emp.txt emp;

emp.txt ファイルには、次のサンプルデータが含まれています。

7369,SMITH,CLERK,7902,1980-12-17 00:00:00,800,,20
7499,ALLEN,SALESMAN,7698,1981-02-20 00:00:00,1600,300,30
7521,WARD,SALESMAN,7698,1981-02-22 00:00:00,1250,500,30
7566,JONES,MANAGER,7839,1981-04-02 00:00:00,2975,,20
7654,MARTIN,SALESMAN,7698,1981-09-28 00:00:00,1250,1400,30
7698,BLAKE,MANAGER,7839,1981-05-01 00:00:00,2850,,30
7782,CLARK,MANAGER,7839,1981-06-09 00:00:00,2450,,10
7788,SCOTT,ANALYST,7566,1987-04-19 00:00:00,3000,,20
7839,KING,PRESIDENT,,1981-11-17 00:00:00,5000,,10
7844,TURNER,SALESMAN,7698,1981-09-08 00:00:00,1500,0,30
7876,ADAMS,CLERK,7788,1987-05-23 00:00:00,1100,,20
7900,JAMES,CLERK,7698,1981-12-03 00:00:00,950,,30
7902,FORD,ANALYST,7566,1981-12-03 00:00:00,3000,,20
7934,MILLER,CLERK,7782,1982-01-23 00:00:00,1300,,10
7948,JACCKA,CLERK,7782,1981-04-12 00:00:00,5000,,10
7956,WELAN,CLERK,7649,1982-07-20 00:00:00,2450,,10
7956,TEBAGE,CLERK,7748,1982-12-30 00:00:00,1300,,10

AVG

  • 構文

    double avg([distinct] double <expr>) over ([partition_clause] [orderby_clause] [frame_clause])
    decimal avg([distinct] decimal <expr>) over ([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    ウィンドウ内の expr の平均値を返します。

  • 説明

    • expr: 必須。このパラメーターは、返される結果の計算に使用される式を指定します。値は DOUBLE または DECIMAL タイプです。

      • 入力値が STRING または BIGINT タイプの場合、計算前に DOUBLE タイプの値に暗黙的に変換されます。別のデータ型の場合は、エラーが返されます。

      • 入力値が NULL の場合、値を含む行は計算に使用されません。

      • distinct キーワードが指定されている場合、個別値の平均値が計算されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr の入力値が DECIMAL タイプの場合、DECIMAL タイプの値が返されます。入力値が別のデータ型の場合は、DOUBLE タイプの値が返されます。expr の入力値が NULL の場合、NULL が返されます。

    • 例 1: deptno 列を使用してウィンドウを定義し、sal 列の平均値を計算します。ORDER BY は指定されていません。この関数は、現在のウィンドウの最初の行から最後の行までの値の累積平均値を返します。現在のウィンドウには、deptno 列の値が同じ行が含まれます。ステートメントの例:

      select deptno, sal, avg(sal) over (partition by deptno) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 2916.6666666666665 |   -- この行はこのウィンドウの最初の行です。戻り値は、1 行目から 6 行目までの値の累積平均値です。
      | 10         | 2450       | 2916.6666666666665 |   -- 戻り値は、1 行目から 6 行目までの値の累積平均値です。
      | 10         | 5000       | 2916.6666666666665 |   -- 戻り値は、1 行目から 6 行目までの値の累積平均値です。
      | 10         | 1300       | 2916.6666666666665 |
      | 10         | 5000       | 2916.6666666666665 |
      | 10         | 2450       | 2916.6666666666665 |
      | 20         | 3000       | 2175.0     |
      | 20         | 3000       | 2175.0     |
      | 20         | 800        | 2175.0     |
      | 20         | 1100       | 2175.0     |
      | 20         | 2975       | 2175.0     |
      | 30         | 1500       | 1566.6666666666667 |
      | 30         | 950        | 1566.6666666666667 |
      | 30         | 1600       | 1566.6666666666667 |
      | 30         | 1250       | 1566.6666666666667 |
      | 30         | 1250       | 1566.6666666666667 |
      | 30         | 2850       | 1566.6666666666667 |
      +------------+------------+------------+
    • 例 2: Hive 互換モードでは、deptno 列を使用してウィンドウを定義し、sal 列の平均値を計算します。ORDER BY が指定されています。この関数は、現在のウィンドウの最初の行から、現在の行と同じ sal 値を持つ行までの値の累積平均値を返します。同じ sal 値を持つ行の平均値は同じです。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      -- 次のステートメントを実行します。
      select deptno, sal, avg(sal) over (partition by deptno order by sal) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 1300.0     |          -- この行はこのウィンドウの最初の行です。最初の行の平均値は、2 つの行の sal 値が同じであるため、1 行目と 2 行目の値の累積平均値です。
      | 10         | 1300       | 1300.0     |          -- 戻り値は、1 行目と 2 行目の値の累積平均値です。
      | 10         | 2450       | 1875.0     |          -- 3 行目と 4 行目の sal 値が同じであるため、3 行目の平均値は、1 行目から 4 行目までの値の累積平均値です。
      | 10         | 2450       | 1875.0     |          -- 戻り値は、1 行目から 4 行目までの値の累積平均値です。
      | 10         | 5000       | 2916.6666666666665 |
      | 10         | 5000       | 2916.6666666666665 |
      | 20         | 800        | 800.0      |
      | 20         | 1100       | 950.0      |
      | 20         | 2975       | 1625.0     |
      | 20         | 3000       | 2175.0     |
      | 20         | 3000       | 2175.0     |
      | 30         | 950        | 950.0      |
      | 30         | 1250       | 1150.0     |
      | 30         | 1250       | 1150.0     |
      | 30         | 1500       | 1237.5     |
      | 30         | 1600       | 1310.0     |
      | 30         | 2850       | 1566.6666666666667 |
      +------------+------------+------------+

CLUSTER_SAMPLE

  • 構文

    boolean cluster_sample(bigint <N>) OVER ([partition_clause])
    boolean cluster_sample(bigint <N>, bigint <M>) OVER ([partition_clause])
  • 説明

    • cluster_sample(bigint <N>): N 個のランダムなデータ行をサンプリングすることを指定します。

    • cluster_sample(bigint <N>, bigint <M>): 指定された比率 (M/N) に基づいて行がサンプリングされることを指定します。サンプリングされる行数は、次の数式を使用して計算されます。partition_row_count × M/Npartition_row_count は、パーティション内の行数を指定します。

  • 説明

    • N: 必須。BIGINT タイプの定数。N が NULL に設定されている場合、NULL が返されます。

    • M: 必須。BIGINT タイプの定数。M が NULL に設定されている場合、NULL が返されます。

    • partition_clause: オプション。詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    戻り値は BOOLEAN タイプの値です。

  • 各グループのデータエントリの約 20% をサンプリングします。ステートメントの例:

    select deptno, sal
        from (
            select deptno, sal, cluster_sample(5, 1) over (partition by deptno) as flag
            from emp
            ) sub
        where flag = true;

    結果の例:

    +------------+------------+
    | deptno     | sal        |
    +------------+------------+
    | 10         | 1300       |
    | 20         | 3000       |
    | 30         | 950        |
    +------------+------------+

COUNT

  • 構文

    bigint count(*) over ([partition_clause] [orderby_clause] [frame_clause])
    bigint count([distinct] <expr>[,...]) over ([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    • count(*): 返される行の総数。

    • count([distinct] <expr>[,...]): 行数を計算する場合、expr が NULL の行は無視されます。複数の expr パラメーターが存在する場合、expr が NULL の行は無視されます。さらに、distinct キーワードが指定されている場合は、重複排除後の行数が計算されます。expr が NULL の行は無視されます。

  • 説明

    • expr: 必須。このパラメーターは、値をカウントする列を指定します。すべてのデータ型がサポートされています。入力値が NULL の場合、この値を含む行は計算に使用されません。DISTINCT キーワードが指定されている場合、個別値のカウント値が取得されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    BIGINT タイプの値が返されます。

    • 例 1: sal 列を使用してウィンドウを定義します。ORDER BY は指定されていません。この関数は、現在のウィンドウの最初の行から最後の行までの累積カウントを返します。現在のウィンドウには、sal 値が同じ行が含まれます。ステートメントの例:

      select sal, count(sal) over (partition by sal) as count from emp;  

      結果の例:

      +------------+------------+
      | sal        | count      |
      +------------+------------+
      | 800        | 1          |
      | 950        | 1          |
      | 1100       | 1          |
      | 1250       | 2          |   -- この行はこのウィンドウの最初の行です。2 つの行の sal 値が同じであるため、最初の行の COUNT の値は 2 番目の行の累積カウントです。
      | 1250       | 2          |   -- 戻り値は、現在のウィンドウの最初の行から 2 番目の行までの累積カウントです。
      | 1300       | 2          |
      | 1300       | 2          |
      | 1500       | 1          |
      | 1600       | 1          |
      | 2450       | 2          |
      | 2450       | 2          |
      | 2850       | 1          |
      | 2975       | 1          |
      | 3000       | 2          |
      | 3000       | 2          |
      | 5000       | 2          |
      | 5000       | 2          |
      +------------+------------+
    • 例 2: sal 列を使用してウィンドウを定義します。ORDER BY が指定されています。この関数は、現在のウィンドウの最初の行から最後の行までの累積カウントを返します。現在のウィンドウには、sal 値が同じ行が含まれます。ステートメントの例:

      -- 次のステートメントを実行します。
      select sal, count(sal) over (partition by sal order by sal) as count from emp; 

      結果の例:

      +------------+------------+
      | sal        | count      |
      +------------+------------+
      | 800        | 1          |
      | 950        | 1          |
      | 1100       | 1          |
      | 1250       | 2          |   -- この行はこのウィンドウの最初の行です。2 つの行の sal 値が同じであるため、最初の行の COUNT の値は 2 番目の行の累積カウントです。
      | 1250       | 2          |   -- 戻り値は、現在のウィンドウの最初の行から 2 番目の行までの累積カウントです。
      | 1300       | 2          |
      | 1300       | 2          |
      | 1500       | 1          |
      | 1600       | 1          |
      | 2450       | 2          |
      | 2450       | 2          |
      | 2850       | 1          |
      | 2975       | 1          |
      | 3000       | 2          |
      | 3000       | 2          |
      | 5000       | 2          |
      | 5000       | 2          |
      +------------+------------+

CUME_DIST

  • 構文

    double cume_dist() over([partition_clause] [orderby_clause])
  • 説明

    この関数は累積分布を計算します。累積分布は、値が現在の行の値以上である行の、パーティション内のすべての行に対する比率を示します。比率は orderby_clause に基づいて決定されます。

  • 説明

    partition_clause および orderby_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    DOUBLE 型の値が返されます。戻り値は、次の式を使用して計算されます。row_number_of_last_peer/partition_row_countrow_number_of_last_peer は、現在の行が属するグループの最後の行に対応する ROW_NUMBER によって返される値を示します。partition_row_count は、現在の行が属するパーティションの行数を示します。

  • すべての従業員を部署 (deptno) 別にグループ化し、各グループの従業員の累積分布を給与別に計算します。ステートメントの例:

    select deptno, ename, sal, concat(round(cume_dist() over (partition by deptno order by sal desc)*100,2),'%') as cume_dist from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | cume_dist  |
    +------------+------------+------------+------------+
    | 10         | JACCKA     | 5000       | 33.33%     |
    | 10         | KING       | 5000       | 33.33%     |
    | 10         | CLARK      | 2450       | 66.67%     |
    | 10         | WELAN      | 2450       | 66.67%     |
    | 10         | TEBAGE     | 1300       | 100.0%     |
    | 10         | MILLER     | 1300       | 100.0%     |
    | 20         | SCOTT      | 3000       | 40.0%      |
    | 20         | FORD       | 3000       | 40.0%      |
    | 20         | JONES      | 2975       | 60.0%      |
    | 20         | ADAMS      | 1100       | 80.0%      |
    | 20         | SMITH      | 800        | 100.0%     |
    | 30         | BLAKE      | 2850       | 16.67%     |
    | 30         | ALLEN      | 1600       | 33.33%     |
    | 30         | TURNER     | 1500       | 50.0%      |
    | 30         | MARTIN     | 1250       | 83.33%     |
    | 30         | WARD       | 1250       | 83.33%     |
    | 30         | JAMES      | 950        | 100.0%     |
    +------------+------------+------------+------------+

DENSE_RANK

  • 構文

    bigint dense_rank() over ([partition_clause] [orderby_clause])
  • 説明

    orderby_clause に基づいてソートされた順序付けられた行のグループ内での行のランクを計算します。ランクは 1 からカウントされます。パーティション内では、order by で指定された列の値が同じ行は、同じランクを持ちます。order by で指定された列の値が変わるたびに、ランクは 1 ずつ増加します。

  • 説明

    partition_clause および orderby_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    BIGINT タイプの値が返されます。orderby_clause が指定されていない場合、返される結果の値はすべて 1 です。

  • deptno 列に基づいてすべての従業員をグループ化します。各グループで、sal 値に基づいて従業員を降順にソートし、それぞれのグループの従業員のシーケンス番号を取得します。ステートメントの例:

    select deptno, ename, sal, dense_rank() over (partition by deptno order by sal desc) as nums from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | nums       |
    +------------+------------+------------+------------+
    | 10         | JACCKA     | 5000       | 1          |
    | 10         | KING       | 5000       | 1          |
    | 10         | CLARK      | 2450       | 2          |
    | 10         | WELAN      | 2450       | 2          |
    | 10         | TEBAGE     | 1300       | 3          |
    | 10         | MILLER     | 1300       | 3          |
    | 20         | SCOTT      | 3000       | 1          |
    | 20         | FORD       | 3000       | 1          |
    | 20         | JONES      | 2975       | 2          |
    | 20         | ADAMS      | 1100       | 3          |
    | 20         | SMITH      | 800        | 4          |
    | 30         | BLAKE      | 2850       | 1          |
    | 30         | ALLEN      | 1600       | 2          |
    | 30         | TURNER     | 1500       | 3          |
    | 30         | MARTIN     | 1250       | 4          |
    | 30         | WARD       | 1250       | 4          |
    | 30         | JAMES      | 950        | 5          |
    +------------+------------+------------+------------+

FIRST_VALUE

  • 構文

    first_value(<expr>[, <ignore_nulls>]) over ([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    ウィンドウの最初の行に対応する expr の値を返します。

  • 説明

    • expr: 必須。返される結果の計算に使用される式。

    • ignore_nulls: オプション。BOOLEAN タイプの値。このパラメーターは、null 値を無視するかどうかを指定します。デフォルト値: false。このパラメーターが true に設定されている場合、ウィンドウの最初の行に対応する expr の null 以外の値が返されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。

  • すべての従業員を部署別にグループ化し、各グループの最初のデータ行を返します。ステートメントの例:

    • ORDER BY は指定されていません。

      select deptno, ename, sal, first_value(sal) over (partition by deptno) as first_value from emp;

      結果の例:

      +------------+------------+------------+-------------+
      | deptno     | ename      | sal        | first_value |
      +------------+------------+------------+-------------+
      | 10         | TEBAGE     | 1300       | 1300        |   -- この行は、現在のウィンドウの最初の行です。
      | 10         | CLARK      | 2450       | 1300        |
      | 10         | KING       | 5000       | 1300        |
      | 10         | MILLER     | 1300       | 1300        |
      | 10         | JACCKA     | 5000       | 1300        |
      | 10         | WELAN      | 2450       | 1300        |
      | 20         | FORD       | 3000       | 3000        |   -- この行は、現在のウィンドウの最初の行です。
      | 20         | SCOTT      | 3000       | 3000        |
      | 20         | SMITH      | 800        | 3000        |
      | 20         | ADAMS      | 1100       | 3000        |
      | 20         | JONES      | 2975       | 3000        |
      | 30         | TURNER     | 1500       | 1500        |   -- この行は、現在のウィンドウの最初の行です。
      | 30         | JAMES      | 950        | 1500        |
      | 30         | ALLEN      | 1600       | 1500        |
      | 30         | WARD       | 1250       | 1500        |
      | 30         | MARTIN     | 1250       | 1500        |
      | 30         | BLAKE      | 2850       | 1500        |
      +------------+------------+------------+-------------+
    • ORDER BY が指定されています。

      select deptno, ename, sal, first_value(sal) over (partition by deptno order by sal desc) as first_value from emp;

      結果の例:

      +------------+------------+------------+-------------+
      | deptno     | ename      | sal        | first_value |
      +------------+------------+------------+-------------+
      | 10         | JACCKA     | 5000       | 5000        |   -- この行は、現在のウィンドウの最初の行です。
      | 10         | KING       | 5000       | 5000        |
      | 10         | CLARK      | 2450       | 5000        |
      | 10         | WELAN      | 2450       | 5000        |
      | 10         | TEBAGE     | 1300       | 5000        |
      | 10         | MILLER     | 1300       | 5000        |
      | 20         | SCOTT      | 3000       | 3000        |   -- この行は、現在のウィンドウの最初の行です。
      | 20         | FORD       | 3000       | 3000        |
      | 20         | JONES      | 2975       | 3000        |
      | 20         | ADAMS      | 1100       | 3000        |
      | 20         | SMITH      | 800        | 3000        |
      | 30         | BLAKE      | 2850       | 2850        |   -- この行は、現在のウィンドウの最初の行です。
      | 30         | ALLEN      | 1600       | 2850        |
      | 30         | TURNER     | 1500       | 2850        |
      | 30         | MARTIN     | 1250       | 2850        |
      | 30         | WARD       | 1250       | 2850        |
      | 30         | JAMES      | 950        | 2850        |
      +------------+------------+------------+-------------+

LAG

  • 構文

    lag(<expr>[,bigint <offset>[, <default>]]) over([partition_clause] orderby_clause)
  • 説明

    指定された offset で現在の行の前にある expr の値を返します。式 expr は、列、列操作、または関数操作にすることができます。

  • 説明

    • expr: 必須。返される結果の計算に使用される式。

    • offset: オプション。値は BIGINT タイプの定数で、0 以上である必要があります。値 0 は現在の行を示し、値 1 は前の行を示します。デフォルト値: 1。入力値が STRING または DOUBLE タイプの場合、計算前に BIGINT タイプの値に暗黙的に変換されます。

    • default: オプション。offset の値が有効な範囲外の場合のデフォルト値。このパラメーターの値は定数である必要があります。このパラメーターのデフォルト値は null です。このパラメーターの値は、expr の値と同じデータ型である必要があります。expr の値が定数でない場合、パラメーター値は現在の行に基づいて決定されます。

    • partition_clause および orderby_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。

  • ウィンドウ内の deptno 列に基づいてすべての従業員をグループ化し、指定されたオフセットで各従業員の sal の値を計算します。ステートメントの例:

    select deptno, ename, sal, lag(sal, 1) over (partition by deptno order by sal) as sal_new from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | sal_new    |
    +------------+------------+------------+------------+
    | 10         | TEBAGE     | 1300       | NULL       |
    | 10         | MILLER     | 1300       | 1300       |
    | 10         | CLARK      | 2450       | 1300       |
    | 10         | WELAN      | 2450       | 2450       |
    | 10         | KING       | 5000       | 2450       |
    | 10         | JACCKA     | 5000       | 5000       |
    | 20         | SMITH      | 800        | NULL       |
    | 20         | ADAMS      | 1100       | 800        |
    | 20         | JONES      | 2975       | 1100       |
    | 20         | SCOTT      | 3000       | 2975       |
    | 20         | FORD       | 3000       | 3000       |
    | 30         | JAMES      | 950        | NULL       |
    | 30         | MARTIN     | 1250       | 950        |
    | 30         | WARD       | 1250       | 1250       |
    | 30         | TURNER     | 1500       | 1250       |
    | 30         | ALLEN      | 1600       | 1500       |
    | 30         | BLAKE      | 2850       | 1600       |
    +------------+------------+------------+------------+

LAST_VALUE

  • 構文

    last_value(<expr>[, <ignore_nulls>]) over([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    expr で指定された式を使用して、ウィンドウ内の最後のデータ行の計算結果を返します。

  • 説明

    • expr: 必須。返される結果の計算に使用される式。

    • ignore_nulls: オプション。BOOLEAN タイプの値。このパラメーターは、null 値を無視するかどうかを指定します。デフォルト値: false。このパラメーターが true に設定されている場合、ウィンドウの最後の行に対応する expr の null 以外の値が返されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。

  • deptno 列に基づいてすべての従業員をグループ化し、各グループの最後のデータ行を返します。ステートメントの例:

    • order by が指定されていない場合、最初の行から最後の行までの行が現在のウィンドウに属します。現在のウィンドウの最後の行の値が返されます。

      select deptno, ename, sal, last_value(sal) over (partition by deptno) as last_value from emp;

      結果の例:

      +------------+------------+------------+-------------+
      | deptno     | ename      | sal        | last_value |
      +------------+------------+------------+-------------+
      | 10         | TEBAGE     | 1300       | 2450        |
      | 10         | CLARK      | 2450       | 2450        |
      | 10         | KING       | 5000       | 2450        |
      | 10         | MILLER     | 1300       | 2450        |
      | 10         | JACCKA     | 5000       | 2450        |   
      | 10         | WELAN      | 2450       | 2450        |   -- この行は、現在のウィンドウの最後の行です。
      | 20         | FORD       | 3000       | 2975        |
      | 20         | SCOTT      | 3000       | 2975        |
      | 20         | SMITH      | 800        | 2975        |
      | 20         | ADAMS      | 1100       | 2975        |
      | 20         | JONES      | 2975       | 2975        |   -- この行は、現在のウィンドウの最後の行です。
      | 30         | TURNER     | 1500       | 2850        |
      | 30         | JAMES      | 950        | 2850        |
      | 30         | ALLEN      | 1600       | 2850        |
      | 30         | WARD       | 1250       | 2850        |
      | 30         | MARTIN     | 1250       | 2850        |
      | 30         | BLAKE      | 2850       | 2850        |   -- この行は、現在のウィンドウの最後の行です。
      +------------+------------+------------+-------------+
    • order by が指定されている場合、最初の行から現在の行までの行が現在のウィンドウに属します。現在のウィンドウの現在の行の値が返されます。

      select deptno, ename, sal, last_value(sal) over (partition by deptno order by sal desc) as last_value from emp;

      結果の例:

      +------------+------------+------------+-------------+
      | deptno     | ename      | sal        | last_value |
      +------------+------------+------------+-------------+
      | 10         | JACCKA     | 5000       | 5000        |   -- この行は、現在のウィンドウの現在の行です。
      | 10         | KING       | 5000       | 5000        |   -- この行は、現在のウィンドウの現在の行です。
      | 10         | CLARK      | 2450       | 2450        |   -- この行は、現在のウィンドウの現在の行です。
      | 10         | WELAN      | 2450       | 2450        |   -- この行は、現在のウィンドウの現在の行です。
      | 10         | TEBAGE     | 1300       | 1300        |   -- この行は、現在のウィンドウの現在の行です。
      | 10         | MILLER     | 1300       | 1300        |   -- この行は、現在のウィンドウの現在の行です。
      | 20         | SCOTT      | 3000       | 3000        |   -- この行は、現在のウィンドウの現在の行です。
      | 20         | FORD       | 3000       | 3000        |   -- この行は、現在のウィンドウの現在の行です。
      | 20         | JONES      | 2975       | 2975        |   -- この行は、現在のウィンドウの現在の行です。
      | 20         | ADAMS      | 1100       | 1100        |   -- この行は、現在のウィンドウの現在の行です。
      | 20         | SMITH      | 800        | 800         |   -- この行は、現在のウィンドウの現在の行です。
      | 30         | BLAKE      | 2850       | 2850        |   -- この行は、現在のウィンドウの現在の行です。
      | 30         | ALLEN      | 1600       | 1600        |   -- この行は、現在のウィンドウの現在の行です。
      | 30         | TURNER     | 1500       | 1500        |   -- この行は、現在のウィンドウの現在の行です。
      | 30         | MARTIN     | 1250       | 1250        |   -- この行は、現在のウィンドウの現在の行です。
      | 30         | WARD       | 1250       | 1250        |   -- この行は、現在のウィンドウの現在の行です。
      | 30         | JAMES      | 950        | 950         |   -- この行は、現在のウィンドウの現在の行です。
      +------------+------------+------------+-------------+

LEAD

  • 構文

    lead(<expr>[, bigint <offset>[, <default>]]) over([partition_clause] orderby_clause)
  • 説明

    指定された offset で現在の行に続く N 番目の行に対応する expr の値を返します。式 expr は、列、列操作、または関数操作にすることができます。

  • 説明

    • expr: 必須。返される結果の計算に使用される式。

    • offset: オプション。値は BIGINT タイプの定数で、0 以上である必要があります。値 0 は現在の行を示し、値 1 は次の行を示します。デフォルト値: 1。入力値が STRING または DOUBLE タイプの場合、計算前に BIGINT タイプの値に暗黙的に変換されます。

    • default: オプション。offset の値が有効な範囲外の場合のデフォルト値。このパラメーターの値は定数である必要があります。このパラメーターのデフォルト値は null です。このパラメーターの値は、expr の値と同じデータ型である必要があります。expr の値が定数でない場合、パラメーター値は現在の行に基づいて決定されます。

    • partition_clause および orderby_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。

  • ウィンドウ内の deptno 列に基づいてすべての従業員をグループ化し、指定されたオフセットで各従業員の sal の値を計算します。ステートメントの例:

    select deptno, ename, sal, lead(sal, 1) over (partition by deptno order by sal) as sal_new from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | sal_new    |
    +------------+------------+------------+------------+
    | 10         | TEBAGE     | 1300       | 1300       |
    | 10         | MILLER     | 1300       | 2450       |
    | 10         | CLARK      | 2450       | 2450       |
    | 10         | WELAN      | 2450       | 5000       |
    | 10         | KING       | 5000       | 5000       |
    | 10         | JACCKA     | 5000       | NULL       |
    | 20         | SMITH      | 800        | 1100       |
    | 20         | ADAMS      | 1100       | 2975       |
    | 20         | JONES      | 2975       | 3000       |
    | 20         | SCOTT      | 3000       | 3000       |
    | 20         | FORD       | 3000       | NULL       |
    | 30         | JAMES      | 950        | 1250       |
    | 30         | MARTIN     | 1250       | 1250       |
    | 30         | WARD       | 1250       | 1500       |
    | 30         | TURNER     | 1500       | 1600       |
    | 30         | ALLEN      | 1600       | 2850       |
    | 30         | BLAKE      | 2850       | NULL       |
    +------------+------------+------------+------------+

MAX

  • 構文

    max(<expr>) over([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    ウィンドウ内の expr の最大値を返します。

  • 説明

    • expr: 必須。最大値の計算に使用される式。入力値は、BOOLEAN 以外の任意のデータ型にすることができます。行の入力値が NULL の場合、この行は計算に使用されません。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じ型の値が返されます。

    • 例 1: deptno 列を使用してウィンドウを定義し、sal 列の最大値を取得します。ORDER BY 句は指定されていません。この関数は、現在のウィンドウの最大値を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      select deptno, sal, max(sal) over (partition by deptno) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 5000       |   -- この行はこのウィンドウの最初の行です。戻り値は、1 行目から 6 行目までの値のうちの最大値です。
      | 10         | 2450       | 5000       |   -- 戻り値は、1 行目から 6 行目までの値のうちの最大値です。
      | 10         | 5000       | 5000       |   -- 戻り値は、1 行目から 6 行目までの値のうちの最大値です。
      | 10         | 1300       | 5000       |
      | 10         | 5000       | 5000       |
      | 10         | 2450       | 5000       |
      | 20         | 3000       | 3000       |
      | 20         | 3000       | 3000       |
      | 20         | 800        | 3000       |
      | 20         | 1100       | 3000       |
      | 20         | 2975       | 3000       |
      | 30         | 1500       | 2850       |
      | 30         | 950        | 2850       |
      | 30         | 1600       | 2850       |
      | 30         | 1250       | 2850       |
      | 30         | 1250       | 2850       |
      | 30         | 2850       | 2850       |
      +------------+------------+------------+
    • 例 2: deptno 列を使用してウィンドウを定義し、sal 列の最大値を取得します。ORDER BY 句が指定されています。この関数は、現在のウィンドウの最初の行から現在の行までの値のうちの最大値を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。次のコマンドを実行します。

      select deptno, sal, max(sal) over (partition by deptno order by sal) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 1300       |   -- この行はこのウィンドウの最初の行です。
      | 10         | 1300       | 1300       |   -- 戻り値は、1 行目と 2 行目の値のうちの最大値です。
      | 10         | 2450       | 2450       |   -- 戻り値は、1 行目から 3 行目までの値のうちの最大値です。
      | 10         | 2450       | 2450       |   -- 戻り値は、1 行目から 4 行目までの値のうちの最大値です。
      | 10         | 5000       | 5000       |
      | 10         | 5000       | 5000       |
      | 20         | 800        | 800        |
      | 20         | 1100       | 1100       |
      | 20         | 2975       | 2975       |
      | 20         | 3000       | 3000       |
      | 20         | 3000       | 3000       |
      | 30         | 950        | 950        |
      | 30         | 1250       | 1250       |
      | 30         | 1250       | 1250       |
      | 30         | 1500       | 1500       |
      | 30         | 1600       | 1600       |
      | 30         | 2850       | 2850       |
      +------------+------------+------------+

MEDIAN

  • 構文

    median(<expr>) over ([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    ウィンドウ内の expr の中央値を返します。

  • 説明

    • expr: 必須。中央値の計算に使用される式。DOUBLE または DECIMAL タイプの値。このパラメーターの値は、長さが 1 ~ 255 桁である必要があります。

      • 入力値が STRING または BIGINT タイプの場合、計算前に DOUBLE タイプの値に暗黙的に変換されます。別のデータ型の場合は、エラーが返されます。

      • 入力値が NULL の場合、NULL が返されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    DOUBLE または DECIMAL タイプの値が返されます。expr で指定されたすべての式の値が NULL の場合、NULL が返されます。

  • deptno 列を使用してウィンドウを定義し、sal 列の中央値を計算します。この関数は、現在のウィンドウの中央値を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。次のコマンドを実行します。

    select deptno, sal, median(sal) over (partition by deptno) from emp;

    結果の例:

    +------------+------------+------------+
    | deptno     | sal        | _c2        |
    +------------+------------+------------+
    | 10         | 1300       | 2450.0     |   -- この行はこのウィンドウの最初の行です。戻り値は、1 行目から 6 行目までの値の中央値です。
    | 10         | 2450       | 22450.0     |
    | 10         | 5000       | 2450.0     |
    | 10         | 1300       | 2450.0     |
    | 10         | 5000       | 2450.0     |
    | 10         | 2450       | 2450.0     |
    | 20         | 3000       | 2975.0     |
    | 20         | 3000       | 2975.0     |
    | 20         | 800        | 2975.0     |
    | 20         | 1100       | 2975.0     |
    | 20         | 2975       | 2975.0     |
    | 30         | 1500       | 1375.0     |
    | 30         | 950        | 1375.0     |
    | 30         | 1600       | 1375.0     |
    | 30         | 1250       | 1375.0     |
    | 30         | 1250       | 1375.0     |
    | 30         | 2850       | 1375.0     |
    +------------+------------+------------+

MIN

  • 構文

    min(<expr>) over([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    ウィンドウ内の expr の最小値を返します。

  • 説明

    • expr: 必須。最小値の計算に使用される式。入力値は、BOOLEAN 以外の任意のデータ型にすることができます。行の値が null の場合、この行は計算に使用されません。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。

    • 例 1: deptno 列を使用してウィンドウを定義し、sal 列の最小値を取得します。ORDER BY 句は指定されていません。この関数は、現在のウィンドウの最小値を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。次のコマンドを実行します。

      select deptno, sal, min(sal) over (partition by deptno) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 1300       |   -- この行はこのウィンドウの最初の行です。戻り値は、1 行目から 6 行目までの値のうちの最小値です。
      | 10         | 2450       | 1300       |   -- 戻り値は、1 行目から 6 行目までの値のうちの最小値です。
      | 10         | 5000       | 1300       |   -- 戻り値は、1 行目から 6 行目までの値のうちの最小値です。
      | 10         | 1300       | 1300       |
      | 10         | 5000       | 1300       |
      | 10         | 2450       | 1300       |
      | 20         | 3000       | 800        |
      | 20         | 3000       | 800        |
      | 20         | 800        | 800        |
      | 20         | 1100       | 800        |
      | 20         | 2975       | 800        |
      | 30         | 1500       | 950        |
      | 30         | 950        | 950        |
      | 30         | 1600       | 950        |
      | 30         | 1250       | 950        |
      | 30         | 1250       | 950        |
      | 30         | 2850       | 950        |
      +------------+------------+------------+
    • 例 2: deptno 列を使用してウィンドウを定義し、sal 列の最小値を取得します。ORDER BY 句が指定されています。この関数は、現在のウィンドウの最初の行から現在の行までの値のうちの最小値を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。次のコマンドを実行します。

      select deptno, sal, min(sal) over (partition by deptno order by sal) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 1300       |   -- この行はこのウィンドウの最初の行です。
      | 10         | 1300       | 1300       |   -- 戻り値は、1 行目と 2 行目の値のうちの最小値です。
      | 10         | 2450       | 1300       |   -- 戻り値は、1 行目から 3 行目までの値のうちの最小値です。
      | 10         | 2450       | 1300       |
      | 10         | 5000       | 1300       |
      | 10         | 5000       | 1300       |
      | 20         | 800        | 800        |
      | 20         | 1100       | 800        |
      | 20         | 2975       | 800        |
      | 20         | 3000       | 800        |
      | 20         | 3000       | 800        |
      | 30         | 950        | 950        |
      | 30         | 1250       | 950        |
      | 30         | 1250       | 950        |
      | 30         | 1500       | 950        |
      | 30         | 1600       | 950        |
      | 30         | 2850       | 950        |
      +------------+------------+------------+

NTILE

  • 構文

    bigint ntile(bigint <N>) over ([partition_clause] [orderby_clause])
  • 説明

    パーティション内のデータ行を同じサイズの N 個のグループに分割し、指定された行が属するグループの番号を返します。パーティション内のデータを同じサイズの N 個のグループに分割できない場合、最初の M 個のグループに 1 行多く割り当てられます。

  • 説明

    • N: 必須。このパラメーターは、分割数を指定します。入力値は BIGINT タイプです。

    • partition_clause および orderby_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    BIGINT タイプの値が返されます。

  • sal 列に基づいてすべての従業員を降順で 3 つのグループに分け、各従業員が属するグループの番号を取得します。ステートメントの例:

    select deptno, ename, sal, ntile(3) over (partition by deptno order by sal desc) as nt3 from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | nt3        |
    +------------+------------+------------+------------+
    | 10         | JACCKA     | 5000       | 1          |
    | 10         | KING       | 5000       | 1          |
    | 10         | CLARK      | 2450       | 2          |
    | 10         | WELAN      | 2450       | 2          |
    | 10         | TEBAGE     | 1300       | 3          |
    | 10         | MILLER     | 1300       | 3          |
    | 20         | SCOTT      | 3000       | 1          |
    | 20         | FORD       | 3000       | 1          |
    | 20         | JONES      | 2975       | 2          |
    | 20         | ADAMS      | 1100       | 2          |
    | 20         | SMITH      | 800        | 3          |
    | 30         | BLAKE      | 2850       | 1          |
    | 30         | ALLEN      | 1600       | 1          |
    | 30         | TURNER     | 1500       | 2          |
    | 30         | MARTIN     | 1250       | 2          |
    | 30         | WARD       | 1250       | 3          |
    | 30         | JAMES      | 950        | 3          |
    +------------+------------+------------+------------+

NTH_VALUE

  • 構文

    nth_value(<expr>, <number> [, <ignore_nulls>]) over ([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    ウィンドウ内の N 番目の行に対応する expr の値を返します。

  • 説明

    • expr: 必須。返される結果の計算に使用される式。

    • number: 必須。値は BIGINT タイプです。値は 1 以上の整数である必要があります。入力値が 1 の場合、この関数は FIRST_VALUE と同等です。

    • ignore_nulls: オプション。BOOLEAN タイプの値。このパラメーターは、null 値を無視するかどうかを指定します。デフォルト値: false。このパラメーターが true に設定されている場合、ウィンドウの N 番目の行に対応する expr の null 以外の値が返されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。

  • すべての従業員を部署別にグループ化し、各グループの 6 番目のデータ行を返します。ステートメントの例:

    • order by が指定されていない場合、最初の行から最後の行までの行が現在のウィンドウに属します。現在のウィンドウの 6 番目の行の値が返されます。

      select deptno, ename, sal, nth_value(sal,6) over (partition by deptno) as nth_value from emp;

      結果の例:

      +------------+------------+------------+------------+
      | deptno     | ename      | sal        | nth_value  |
      +------------+------------+------------+------------+
      | 10         | TEBAGE     | 1300       | 2450       |
      | 10         | CLARK      | 2450       | 2450       |
      | 10         | KING       | 5000       | 2450       |
      | 10         | MILLER     | 1300       | 2450       |
      | 10         | JACCKA     | 5000       | 2450       |
      | 10         | WELAN      | 2450       | 2450       |   -- この行は、現在のウィンドウの 6 番目の行です。
      | 20         | FORD       | 3000       | NULL       |
      | 20         | SCOTT      | 3000       | NULL       |
      | 20         | SMITH      | 800        | NULL       |
      | 20         | ADAMS      | 1100       | NULL       |
      | 20         | JONES      | 2975       | NULL       |   -- 現在のウィンドウには 6 行未満しかないため、null が返されます。
      | 30         | TURNER     | 1500       | 2850       |
      | 30         | JAMES      | 950        | 2850       |
      | 30         | ALLEN      | 1600       | 2850       |
      | 30         | WARD       | 1250       | 2850       |
      | 30         | MARTIN     | 1250       | 2850       |
      | 30         | BLAKE      | 2850       | 2850       |   -- この行は、現在のウィンドウの 6 番目の行です。
      +------------+------------+------------+------------+
    • order by が指定されている場合、最初の行から現在の行までの行が現在のウィンドウに属します。現在のウィンドウの 6 番目の行の値が返されます。

      select deptno, ename, sal, nth_value(sal,6) over (partition by deptno order by sal) as nth_value from emp;

      結果の例:

      +------------+------------+------------+------------+
      | deptno     | ename      | sal        | nth_value  |
      +------------+------------+------------+------------+
      | 10         | TEBAGE     | 1300       | NULL       |   
      | 10         | MILLER     | 1300       | NULL       |   -- このウィンドウには 2 行しかないため、NULL が返されます。
      | 10         | CLARK      | 2450       | NULL       |
      | 10         | WELAN      | 2450       | NULL       |
      | 10         | KING       | 5000       | 5000       |  
      | 10         | JACCKA     | 5000       | 5000       |
      | 20         | SMITH      | 800        | NULL       |
      | 20         | ADAMS      | 1100       | NULL       |
      | 20         | JONES      | 2975       | NULL       |
      | 20         | SCOTT      | 3000       | NULL       |
      | 20         | FORD       | 3000       | NULL       |
      | 30         | JAMES      | 950        | NULL       |
      | 30         | MARTIN     | 1250       | NULL       |
      | 30         | WARD       | 1250       | NULL       |
      | 30         | TURNER     | 1500       | NULL       |
      | 30         | ALLEN      | 1600       | NULL       |
      | 30         | BLAKE      | 2850       | 2850       |
      +------------+------------+------------+------------+

PERCENT_RANK

  • 構文

    double percent_rank() over([partition_clause] [orderby_clause])
  • 説明

    orderby_clause に基づいて、パーティション内の現在の行のパーセンタイルランクを計算します。

  • 説明

    partition_clause および orderby_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    DOUBLE 型の値が返されます。有効値の範囲は [0.0, 1.0] です。戻り値は、次の数式を使用して計算されます。(rank - 1)/(partition_row_count - 1)rank は、現在の行に対応する RANK 関数の戻り値を示します。partition_row_count は、現在の行が属するパーティションの行数を示します。パーティションにデータ行が 1 行しかない場合は、0.0 が返されます。

  • sal 列に基づいて、グループ内の各従業員のパーセンタイルランクを計算します。ステートメントの例:

    select deptno, ename, sal, percent_rank() over (partition by deptno order by sal desc) as sal_new from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | sal_new    |
    +------------+------------+------------+------------+
    | 10         | JACCKA     | 5000       | 0.0        |
    | 10         | KING       | 5000       | 0.0        |
    | 10         | CLARK      | 2450       | 0.4        |
    | 10         | WELAN      | 2450       | 0.4        |
    | 10         | TEBAGE     | 1300       | 0.8        |
    | 10         | MILLER     | 1300       | 0.8        |
    | 20         | SCOTT      | 3000       | 0.0        |
    | 20         | FORD       | 3000       | 0.0        |
    | 20         | JONES      | 2975       | 0.5        |
    | 20         | ADAMS      | 1100       | 0.75       |
    | 20         | SMITH      | 800        | 1.0        |
    | 30         | BLAKE      | 2850       | 0.0        |
    | 30         | ALLEN      | 1600       | 0.2        |
    | 30         | TURNER     | 1500       | 0.4        |
    | 30         | MARTIN     | 1250       | 0.6        |
    | 30         | WARD       | 1250       | 0.6        |
    | 30         | JAMES      | 950        | 1.0        |
    +------------+------------+------------+------------+

RANK

  • 構文

    bigint rank() over ([partition_clause] [orderby_clause])
  • 説明

    orderby_clause に基づいてソートされた、順序付けられた行のグループ内の行のランクを計算します。ランクは 1 からカウントされます。

  • 説明

    partition_clause および orderby_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    BIGINT 型の値が返されます。戻り値は重複したり、連続していない可能性があります。戻り値は、現在の行が属するグループの最初の行のシーケンス番号です。ROW_NUMBER() 関数を使用して、最初の行のシーケンス番号が計算されます。orderby_clause が指定されていない場合、返される結果の値はすべて 1 です。

  • deptno 列に基づいてすべての従業員をグループ化します。各グループで、sal 値に基づいて従業員を降順にソートし、それぞれのグループの従業員のシーケンス番号を取得します。ステートメントの例:

    select deptno, ename, sal, rank() over (partition by deptno order by sal desc) as nums from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | nums       |
    +------------+------------+------------+------------+
    | 10         | JACCKA     | 5000       | 1          |
    | 10         | KING       | 5000       | 1          |
    | 10         | CLARK      | 2450       | 3          |
    | 10         | WELAN      | 2450       | 3          |
    | 10         | TEBAGE     | 1300       | 5          |
    | 10         | MILLER     | 1300       | 5          |
    | 20         | SCOTT      | 3000       | 1          |
    | 20         | FORD       | 3000       | 1          |
    | 20         | JONES      | 2975       | 3          |
    | 20         | ADAMS      | 1100       | 4          |
    | 20         | SMITH      | 800        | 5          |
    | 30         | BLAKE      | 2850       | 1          |
    | 30         | ALLEN      | 1600       | 2          |
    | 30         | TURNER     | 1500       | 3          |
    | 30         | MARTIN     | 1250       | 4          |
    | 30         | WARD       | 1250       | 4          |
    | 30         | JAMES      | 950        | 6          |
    +------------+------------+------------+------------+

ROW_NUMBER

  • 構文

    row_number() over([partition_clause] [orderby_clause])
  • 説明

    パーティション内の現在の行のシーケンス番号を返します。シーケンス番号は 1 からカウントされます。

  • 説明

    詳細については、「windowing_definition」をご参照ください。frame_clause はサポートされていません。

  • 戻り値

    BIGINT タイプの値が返されます。

  • deptno 列に基づいてすべての従業員をグループ化します。各グループで、sal 値に基づいて従業員を降順にソートし、それぞれのグループの従業員のシーケンス番号を取得します。ステートメントの例:

    select deptno, ename, sal, row_number() over (partition by deptno order by sal desc) as nums from emp;

    結果の例:

    +------------+------------+------------+------------+
    | deptno     | ename      | sal        | nums       |
    +------------+------------+------------+------------+
    | 10         | JACCKA     | 5000       | 1          |
    | 10         | KING       | 5000       | 2          |
    | 10         | CLARK      | 2450       | 3          |
    | 10         | WELAN      | 2450       | 4          |
    | 10         | TEBAGE     | 1300       | 5          |
    | 10         | MILLER     | 1300       | 6          |
    | 20         | SCOTT      | 3000       | 1          |
    | 20         | FORD       | 3000       | 2          |
    | 20         | JONES      | 2975       | 3          |
    | 20         | ADAMS      | 1100       | 4          |
    | 20         | SMITH      | 800        | 5          |
    | 30         | BLAKE      | 2850       | 1          |
    | 30         | ALLEN      | 1600       | 2          |
    | 30         | TURNER     | 1500       | 3          |
    | 30         | MARTIN     | 1250       | 4          |
    | 30         | WARD       | 1250       | 5          |
    | 30         | JAMES      | 950        | 6          |
    +------------+------------+------------+------------+

STDDEV

  • 構文

    double stddev|stddev_pop([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause])
    decimal stddev|stddev_pop([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    すべての入力値の母集団標準偏差を返します。この関数は STDDEV_POP とも呼ばれます。

  • 説明

    • expr: 必須。母集団標準偏差の計算に使用される式。入力値は DOUBLE または DECIMAL タイプにすることができます。

      • 入力値が STRINGまたは BIGINT タイプの場合、計算前に DOUBLE タイプの値に暗黙的に変換されます。別のデータ型の場合は、エラーが返されます。

      • 行の値が null の場合、この行は計算に使用されません。

      • distinct キーワードが指定されている場合、個別値の母集団標準偏差が計算されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。expr で指定されたすべての式の値が null の場合、null が返されます。

    • 例 1: deptno 列を使用してウィンドウを定義し、sal 列の母集団標準偏差を計算します。ORDER BY 句は指定されていません。この関数は、現在のウィンドウの累積母集団標準偏差を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      select deptno, sal, stddev(sal) over (partition by deptno) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 1546.1421524412158 |   -- この行はこのウィンドウの最初の行です。戻り値は、1 行目から 6 行目までの値の累積母集団標準偏差です。
      | 10         | 2450       | 1546.1421524412158 |   -- 戻り値は、1 行目から 6 行目までの値の累積母集団標準偏差です。
      | 10         | 5000       | 1546.1421524412158 |
      | 10         | 1300       | 1546.1421524412158 |
      | 10         | 5000       | 1546.1421524412158 |
      | 10         | 2450       | 1546.1421524412158 |
      | 20         | 3000       | 1004.7387720198718 |
      | 20         | 3000       | 1004.7387720198718 |
      | 20         | 800        | 1004.7387720198718 |
      | 20         | 1100       | 1004.7387720198718 |
      | 20         | 2975       | 1004.7387720198718 |
      | 30         | 1500       | 610.1001739241042 |
      | 30         | 950        | 610.1001739241042 |
      | 30         | 1600       | 610.1001739241042 |
      | 30         | 1250       | 610.1001739241042 |
      | 30         | 1250       | 610.1001739241042 |
      | 30         | 2850       | 610.1001739241042 |
      +------------+------------+------------+
    • 例 2: deptno 列を使用してウィンドウを定義し、sal 列の母集団標準偏差を計算します。ORDER BY 句が指定されています。この関数は、現在のウィンドウの最初の行から、現在の行と同じ sal 値を持つ行までの値の累積母集団標準偏差を返します。同じ sal 値を持つ行の母集団標準偏差は同じです。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      -- 次のステートメントを実行します。
      select deptno, sal, stddev(sal) over (partition by deptno order by sal) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 0.0        |           -- この行はこのウィンドウの最初の行です。2 つの行の sal 値が同じであるため、最初の行の母集団標準偏差は、1 行目と 2 行目の値の累積母集団標準偏差です。
      | 10         | 1300       | 0.0        |           -- 戻り値は、1 行目と 2 行目の値の累積母集団標準偏差です。
      | 10         | 2450       | 575.0      |           -- 3 行目と 4 行目の sal 値が同じであるため、3 行目の母集団標準偏差は、1 行目から 4 行目までの値の累積母集団標準偏差です。
      | 10         | 2450       | 575.0      |           -- 戻り値は、1 行目から 4 行目までの値の累積母集団標準偏差です。
      | 10         | 5000       | 1546.1421524412158 |
      | 10         | 5000       | 1546.1421524412158 |
      | 20         | 800        | 0.0        |
      | 20         | 1100       | 150.0      |
      | 20         | 2975       | 962.4188277460079 |
      | 20         | 3000       | 1004.7387720198718 |
      | 20         | 3000       | 1004.7387720198718 |
      | 30         | 950        | 0.0        |
      | 30         | 1250       | 141.4213562373095 |
      | 30         | 1250       | 141.4213562373095 |
      | 30         | 1500       | 194.8557158514987 |
      | 30         | 1600       | 226.71568097509268 |
      | 30         | 2850       | 610.1001739241042 |
      +------------+------------+------------+

STDDEV_SAMP

  • 構文

    double stddev_samp([distinct] <expr>) over([partition_clause] [orderby_clause] [frame_clause])
    decimal stddev_samp([distinct] <expr>) over([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    この関数は、すべての入力値の標本標準偏差を返します。

  • 説明

    • expr: 必須。このパラメーターは、標本標準偏差の計算に使用される式を指定します。入力値は DOUBLE または DECIMAL タイプにすることができます。

      • 入力値が STRING または BIGINT タイプの場合、計算前に DOUBLE タイプの値に暗黙的に変換されます。別のデータ型の場合は、エラーが返されます。

      • 行の値が NULL の場合、この行は計算に使用されません。

      • distinct キーワードが指定されている場合、個別値の標本標準偏差が計算されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    expr と同じデータ型の値が返されます。expr で指定されたすべての式の値が NULL の場合、NULL が返されます。ウィンドウに expr 値が NULL でないデータ行が 1 つだけ含まれている場合、0 が返されます。

    • 例 1: deptno 列を使用してウィンドウを定義し、sal 列の標本標準偏差を計算します。ORDER BY 句は指定されていません。この関数は、現在のウィンドウの累積標本標準偏差を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      select deptno, sal, stddev_samp(sal) over (partition by deptno) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 1693.7138680032904 |   -- この行はこのウィンドウの最初の行です。戻り値は、1 行目から 6 行目までの値の累積標本標準偏差です。
      | 10         | 2450       | 1693.7138680032904 |   -- 戻り値は、1 行目から 6 行目までの値の累積標本標準偏差です。
      | 10         | 5000       | 1693.7138680032904 |   -- 戻り値は、1 行目から 6 行目までの値の累積標本標準偏差です。
      | 10         | 1300       | 1693.7138680032904 |     
      | 10         | 5000       | 1693.7138680032904 |
      | 10         | 2450       | 1693.7138680032904 |
      | 20         | 3000       | 1123.3320969330487 |
      | 20         | 3000       | 1123.3320969330487 |
      | 20         | 800        | 1123.3320969330487 |
      | 20         | 1100       | 1123.3320969330487 |
      | 20         | 2975       | 1123.3320969330487 |
      | 30         | 1500       | 668.331255192114 |
      | 30         | 950        | 668.331255192114 |
      | 30         | 1600       | 668.331255192114 |
      | 30         | 1250       | 668.331255192114 |
      | 30         | 1250       | 668.331255192114 |
      | 30         | 2850       | 668.331255192114 |
      +------------+------------+------------+
    • 例 2: deptno 列を使用してウィンドウを定義し、sal 列の標本標準偏差を計算します。ORDER BY 句が指定されています。この関数は、現在のウィンドウの最初の行から現在の行までの値の累積標本標準偏差を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      select deptno, sal, stddev_samp(sal) over (partition by deptno order by sal) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 0.0        |          -- この行はこのウィンドウの最初の行です。
      | 10         | 1300       | 0.0        |          -- 戻り値は、1 行目と 2 行目の値の累積標本標準偏差です。
      | 10         | 2450       | 663.9528095680697 |   -- 戻り値は、1 行目から 3 行目までの値の累積標本標準偏差です。
      | 10         | 2450       | 663.9528095680696 |
      | 10         | 5000       | 1511.2081259707413 |
      | 10         | 5000       | 1693.7138680032904 |
      | 20         | 800        | 0.0        |
      | 20         | 1100       | 212.13203435596427 |
      | 20         | 2975       | 1178.7175234126282 |
      | 20         | 3000       | 1182.7536725793752 |
      | 20         | 3000       | 1123.3320969330487 |
      | 30         | 950        | 0.0        |
      | 30         | 1250       | 212.13203435596427 |
      | 30         | 1250       | 173.20508075688772 |
      | 30         | 1500       | 225.0      |
      | 30         | 1600       | 253.4758371127315 |
      | 30         | 2850       | 668.331255192114 |
      +------------+------------+------------+

SUM

  • 構文

    sum([distinct] <expr>) over ([partition_clause] [orderby_clause] [frame_clause])
  • 説明

    ウィンドウ内の expr の合計を返します。

  • 説明

    • expr: 必須。このパラメーターは、合計を計算する列を指定します。列は DOUBLE、DECIMAL、または BIGINT タイプにすることができます。

      • 入力値が STRING タイプの場合、計算前に DOUBLE タイプの値に暗黙的に変換されます。別のデータ型の場合は、エラーが返されます。

      • 行の入力値が null の場合、行は計算に使用されません。

      • distinct キーワードが指定されている場合、個別値の合計が計算されます。

    • partition_clauseorderby_clause、および frame_clause: これらのパラメーターの詳細については、「windowing_definition」をご参照ください。

  • 戻り値

    • 入力値が BIGINT タイプの場合、BIGINT タイプの値が返されます。

    • 入力値が DECIMAL タイプの場合、DECIMAL タイプの値が返されます。

    • 入力値が DOUBLE または STRING タイプの場合、DOUBLE タイプの値が返されます。

    • 入力値が null の場合、null が返されます。

    • 例 1: deptno 列を使用してウィンドウを定義し、sal 列の合計を計算します。ORDER BY 句は指定されていません。この関数は、現在のウィンドウの累積合計を返します。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      select deptno, sal, sum(sal) over (partition by deptno) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 17500      |   -- この行はこのウィンドウの最初の行です。戻り値は、1 行目から 6 行目までの値の累積合計です。
      | 10         | 2450       | 17500      |   -- 戻り値は、1 行目から 6 行目までの値の累積合計です。
      | 10         | 5000       | 17500      |   -- 戻り値は、1 行目から 6 行目までの値の累積合計です。
      | 10         | 1300       | 17500      |
      | 10         | 5000       | 17500      |
      | 10         | 2450       | 17500      |
      | 20         | 3000       | 10875      |
      | 20         | 3000       | 10875      |
      | 20         | 800        | 10875      |
      | 20         | 1100       | 10875      |
      | 20         | 2975       | 10875      |
      | 30         | 1500       | 9400       |
      | 30         | 950        | 9400       |
      | 30         | 1600       | 9400       |
      | 30         | 1250       | 9400       |
      | 30         | 1250       | 9400       |
      | 30         | 2850       | 9400       |
      +------------+------------+------------+
    • 例 2: deptno 列を使用してウィンドウを定義し、sal 列の合計を計算します。ORDER BY 句が指定されています。この関数は、現在のウィンドウの最初の行から、現在の行と同じ sal 値を持つ行までの値の累積合計を返します。同じ sal 値を持つ行の合計値は同じです。現在のウィンドウには、deptno 値が同じ行が含まれます。ステートメントの例:

      -- 次のステートメントを実行します。
      select deptno, sal, sum(sal) over (partition by deptno order by sal) from emp;

      結果の例:

      +------------+------------+------------+
      | deptno     | sal        | _c2        |
      +------------+------------+------------+
      | 10         | 1300       | 2600       |   -- この行はこのウィンドウの最初の行です。2 つの行の sal 値が同じであるため、最初の行の合計は、1 行目と 2 行目の値の累積合計です。
      | 10         | 1300       | 2600       |   -- 戻り値は、1 行目と 2 行目の値の累積合計です。
      | 10         | 2450       | 7500       |   -- 3 行目と 4 行目の sal 値が同じであるため、3 行目の合計は、1 行目から 4 行目までの値の累積合計です。
      | 10         | 2450       | 7500       |   -- 戻り値は、1 行目から 4 行目までの値の累積合計です。
      | 10         | 5000       | 17500      |
      | 10         | 5000       | 17500      |
      | 20         | 800        | 800        |
      | 20         | 1100       | 1900       |
      | 20         | 2975       | 4875       |
      | 20         | 3000       | 10875      |
      | 20         | 3000       | 10875      |
      | 30         | 950        | 950        |
      | 30         | 1250       | 3450       |
      | 30         | 1250       | 3450       |
      | 30         | 1500       | 4950       |
      | 30         | 1600       | 6550       |
      | 30         | 2850       | 9400       |
      +------------+------------+------------+