- カテゴリ:
ウィンドウ関数 (ランク関連、ウィンドウフレーム)
LAST_VALUE¶
値が順序付けられたグループ内の最後の値を返します。
- こちらもご参照ください。
構文¶
LAST_VALUE( <expr> ) [ { IGNORE | RESPECT } NULLS ]
OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
window_frame
構文の詳細については、 ウィンドウフレームの構文と使用法 をご参照ください。
引数¶
expr
戻り値を決定する式。
expr1
行を分割するための式。単一の式または式のコンマ区切りリストを指定できます。例:
PARTITION BY column_1, column_2
expr2
行を並べ替える式。単一の式または式のコンマ区切りリストを指定できます。例:
ORDER BY column_3, column_4
使用上の注意¶
他のシステムでこの関数の実装における互換性を保つために、関数の引数で
{ IGNORE | RESPECT } NULLS
を指定することもできます。LAST_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') ...
パーティションのいずれかに同一の列
o
の値が含まれるか、大文字と小文字を区別しない比較で同一である場合、クエリ結果は異なる可能性があります。OVER 句内の ORDER BY 句は、クエリ全体の出力内にある行の順序ではなく、ウィンドウ内の行の順序のみを制御します。出力順序を制御するには、クエリの最も外側のレベルで別の ORDER BY 句を使用します。
オプションの
window_frame
(累積またはスライド)は、関数が計算されるウィンドウ内の行のサブセットを指定します。ウィンドウフレームの場合、この関数は RANGEベースのウィンドウフレームではなく、 ROWSベースのウィンドウフレームのみをサポートします。
- サポート対象:
ROWS BETWEEN ... AND ...
- サポート対象外:
RANGE BETWEEN ... AND ...
window_frame
が指定されていない場合、デフォルトはウィンドウ全体です。ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
これは、ウィンドウフレームに次のデフォルトを指定する ANSI 標準とは 異なります。
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
構文や例を含むウィンドウフレームの詳細については、 ウィンドウフレームの構文と使用法 をご参照ください。
例¶
SELECT
column1,
column2,
LAST_VALUE(column2) OVER (PARTITION BY column1 ORDER BY column2) AS column2_last
FROM VALUES
(1, 10), (1, 11), (1, 12),
(2, 20), (2, 21), (2, 22);
+---------+---------+--------------+
| COLUMN1 | COLUMN2 | COLUMN2_LAST |
|---------+---------+--------------|
| 1 | 10 | 12 |
| 1 | 11 | 12 |
| 1 | 12 | 12 |
| 2 | 20 | 22 |
| 2 | 21 | 22 |
| 2 | 22 | 22 |
+---------+---------+--------------+
次のクエリは、 FIRST_VALUE
、 NTH_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 |
+---------------+-----------+---+-----------+---------+----------+