カテゴリ:

ウィンドウ関数 (ランク関連、ウィンドウフレーム)

FIRST_VALUE

値が順序付けられたグループ内の最初の値を返します。

こちらもご参照ください。

LAST_VALUENTH_VALUE

構文

FIRST_VALUE( <expr> ) [ { IGNORE | RESPECT } NULLS ]
                      OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2>  [ { ASC | DESC } ] [ <window_frame> ] )
Copy

window_frame 構文の詳細については、 ウィンドウフレームの構文と使用法 をご参照ください。

引数

expr

戻り値を決定する式。

expr1

行を分割するための式。単一の式または式のコンマ区切りリストを指定できます。例:

PARTITION BY column_1, column_2
Copy
expr2

行を並べ替える式。単一の式または式のコンマ区切りリストを指定できます。例:

ORDER BY column_3, column_4
Copy

使用上の注意

  • 他のシステムでのこの関数の実装との互換性のために、関数の引数で { IGNORE | RESPECT } NULLS を指定することもできます。

    FIRST_VALUE( <式> [ { IGNORE | RESPECT } NULLS ] ) OVER ...

  • { IGNORE | RESPECT } NULLS が指定されていない場合、デフォルトは RESPECT NULLS です(つまり、式にNULL値が含まれ、それが式の最初の値である場合、NULL値が返されます)。

  • この関数はランク関連の関数であるため、ウィンドウを指定する必要があります。ウィンドウ句は、次のサブ句で構成されています。

    • PARTITION BY <式1> 副次句(オプション)。

    • ORDER BY <式2> サブ句(必須)サポートされている追加の順序付けオプション(並べ替え順序、NULL 値の順序付けなど)の詳細については、同様のルールに従う ORDER BY クエリ構成のドキュメントをご参照ください。

    • window_frame 副次句(オプション)。

  • ウィンドウ内の行の順序(したがってクエリの結果)は、 ORDER BY 句のキーによって各行が一意になる場合にのみ完全に決定論的です。次の例を考えてみましょう:

    ... OVER (PARTITION BY p ORDER BY o COLLATE 'lower') ...
    
    Copy

    パーティションのいずれかに同一の列 o の値が含まれるか、大文字と小文字を区別しない比較で同一である場合、クエリ結果は異なる可能性があります。

  • OVER 句内の ORDER BY 句は、クエリ全体の出力内にある行の順序ではなく、ウィンドウ内の行の順序のみを制御します。出力順序を制御するには、クエリの最も外側のレベルで別の ORDER BY 句を使用します。

  • オプションの window_frame (累積またはスライド)は、関数が計算されるウィンドウ内の行のサブセットを指定します。 window_frame が指定されていない場合、デフォルトはウィンドウ全体です。

    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

    これは、ウィンドウフレームに次のデフォルトを指定するANSI標準とは異なります。

    RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

    構文や例を含むウィンドウフレームの詳細については、 ウィンドウフレームの構文と使用法 をご参照ください。

これは、 FIRST_VALUE() を使用した簡単なクエリを示しています。このクエリには、2つの ORDER BY サブ句が含まれています。1つは各パーティションの行の順序を制御し、もう1つは完全なクエリの出力の順序を制御します。

SELECT
        column1,
        column2,
        FIRST_VALUE(column2) OVER (PARTITION BY column1 ORDER BY column2 NULLS LAST) AS column2_first
    FROM VALUES
       (1, 10), (1, 11), (1, null), (1, 12),
       (2, 20), (2, 21), (2, 22)
    ORDER BY column1, column2;
+---------+---------+---------------+
| COLUMN1 | COLUMN2 | COLUMN2_FIRST |
|---------+---------+---------------|
|       1 |      10 |            10 |
|       1 |      11 |            10 |
|       1 |      12 |            10 |
|       1 |    NULL |            10 |
|       2 |      20 |            20 |
|       2 |      21 |            20 |
|       2 |      22 |            20 |
+---------+---------+---------------+
Copy

次のクエリは、 FIRST_VALUENTH_VALUE、および LAST_VALUE の出力を対比します。注意:

  • クエリは、幅が3行分のスライディングウィンドウフレームを作成します。これには、次のものが含まれます。

    • 現在の行の前の行。

    • 現在の行。

    • 現在の行に続く行。

  • 呼び出し NTH_VALUE(i, 2)2 は、ウィンドウフレームの2番目の行(この場合は現在の行でもある)を指定します。

  • 現在の行がウィンドウフレームの最初の行である場合、参照する前の行がないため、 FIRST_VALUE() はその行に対して NULL を返します。

SELECT
        partition_col, order_col, i,
        FIRST_VALUE(i)  OVER (PARTITION BY partition_col ORDER BY order_col
            ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS FIRST_VAL,
        NTH_VALUE(i, 2) OVER (PARTITION BY partition_col ORDER BY order_col
            ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS NTH_VAL,
        LAST_VALUE(i)   OVER (PARTITION BY partition_col ORDER BY order_col
            ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS LAST_VAL
    FROM demo1
    ORDER BY partition_col, i, order_col;
+---------------+-----------+---+-----------+---------+----------+
| PARTITION_COL | ORDER_COL | I | FIRST_VAL | NTH_VAL | LAST_VAL |
|---------------+-----------+---+-----------+---------+----------|
|             1 |         1 | 1 |      NULL |       1 |        2 |
|             1 |         2 | 2 |         1 |       2 |        3 |
|             1 |         3 | 3 |         2 |       3 |        4 |
|             1 |         4 | 4 |         3 |       4 |        5 |
|             1 |         5 | 5 |         4 |       5 |        5 |
|             2 |         1 | 1 |      NULL |       1 |        2 |
|             2 |         2 | 2 |         1 |       2 |        3 |
|             2 |         3 | 3 |         2 |       3 |        4 |
|             2 |         4 | 4 |         3 |       4 |        4 |
+---------------+-----------+---+-----------+---------+----------+
Copy