FIRST_VALUE
構文
関連項目:
構文、セマンティクス、制限事項、およびexpr
の書式の詳細は、「分析ファンクション」を参照してください。
目的
FIRST_VALUE
は分析ファンクションです。これは、順序付けられた値の集合にある最初の値を戻します。集合内の最初の値がNULLの場合、IGNORE NULLS
を指定していないかぎり、ファンクションはNULL
を戻します。この設定は、データの稠密化に役立ちます。
ノート:
この構文の2つの書式は、同じ動作になります。上のブランチはANSI形式です。ANSIとの互換性を維持するために、こちらを使用することをお薦めします。
{RESPECT
| IGNORE
} NULLS
は、expr
のNULL値を計算に含めるか除外するかを指定します。デフォルトはRESPECT
NULLS
です。IGNORE NULLS
を指定すると、FIRST_VALUE
は集合内の最初のNULLではない値を戻します。すべての値がNULLの場合はNULL
を戻します。データの稠密化の例は、「パーティション化された外部結合の使用方法: 例」を参照してください。
expr
には、FIRST_VALUE
または他の分析ファンクションを使用して分析ファンクションをネストできません。ただし、他の組込みファンクション式をexpr
で使用できます。expr
の書式の詳細は、「SQL式」を参照してください。
関連項目:
FIRST_VALUE
の戻り値が文字値である場合に、それに割り当てる照合を定義する照合導出ルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。
例
次の例では、部門90の各従業員について、その部門で給与が一番少ない従業員の名前を選択します。
SELECT employee_id, last_name, salary, hire_date, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS fv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date); EMPLOYEE_ID LAST_NAME SALARY HIRE_DATE FV ----------- ------------------------- ---------- --------- ------- 102 De Haan 17000 13-JAN-01 De Haan 101 Kochhar 17000 21-SEP-05 De Haan 100 King 24000 17-JUN-03 De Haan
例では、FIRST_VALUE
ファンクションの非決定的な性質が示されています。KochharとDe Haanの給与は同じであるため、Kochharの次の行にDe Haanがあります。Kochharが最初に表示されているのは、副問合せが戻す行がhire_date
で順序付けられているためです。ただし、副問合せが戻す行がhire_date
で降順に順序付けられている場合は、次の例に示すとおり、ファンクションは異なる値を戻します。
SELECT employee_id, last_name, salary, hire_date,
FIRST_VALUE(last_name)
OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS fv
FROM (SELECT * FROM employees
WHERE department_id = 90
ORDER by hire_date DESC);
EMPLOYEE_ID LAST_NAME SALARY HIRE_DATE FV
----------- ------------------------- ---------- --------- -------
101 Kochhar 17000 21-SEP-05 Kochhar
102 De Haan 17000 13-JAN-01 Kochhar
100 King 24000 17-JUN-03 Kochhar
次の2つの例では、一意キーで順序付けることによって、FIRST_VALUE
ファンクションを決定的にする方法を示しています。給与と一意キーemployee_id
の両方でファンクション内を順序付けると、副問合せの順序付けにかかわらず、同じ結果が戻されます。
SELECT employee_id, last_name, salary, hire_date, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC, employee_id ROWS UNBOUNDED PRECEDING) AS fv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date); EMPLOYEE_ID LAST_NAME SALARY HIRE_DATE FV ----------- ------------------------- ---------- --------- ------- 101 Kochhar 17000 21-SEP-05 Kochhar 102 De Haan 17000 13-JAN-01 Kochhar 100 King 24000 17-JUN-03 Kochhar SELECT employee_id, last_name, salary, hire_date, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC, employee_id ROWS UNBOUNDED PRECEDING) AS fv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date DESC); EMPLOYEE_ID LAST_NAME SALARY HIRE_DATE FV ----------- ------------------------- ---------- --------- ------- 101 Kochhar 17000 21-SEP-05 Kochhar 102 De Haan 17000 13-JAN-01 Kochhar 100 King 24000 17-JUN-03 Kochhar
次の2つの例では、論理オフセット(ROWS
のかわりにRANGE
)を使用すると、FIRST_VALUE
ファンクションが決定的になることを示しています。ORDER
BY
式に重複値がある場合は、FIRST_VALUE
がexpr
の最小値になります。
SELECT employee_id, last_name, salary, hire_date, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC RANGE UNBOUNDED PRECEDING) AS fv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date); EMPLOYEE_ID LAST_NAME SALARY HIRE_DATE FV ----------- ------------------------- ---------- --------- ------- 102 De Haan 17000 13-JAN-01 De Haan 101 Kochhar 17000 21-SEP-05 De Haan 100 King 24000 17-JUN-03 De Haan SELECT employee_id, last_name, salary, hire_date, FIRST_VALUE(last_name) OVER (ORDER BY salary ASC RANGE UNBOUNDED PRECEDING) AS fv FROM (SELECT * FROM employees WHERE department_id = 90 ORDER BY hire_date DESC); EMPLOYEE_ID LAST_NAME SALARY HIRE_DATE FV ----------- ------------------------- ---------- --------- ------- 102 De Haan 17000 13-JAN-01 De Haan 101 Kochhar 17000 21-SEP-05 De Haan 100 King 24000 17-JUN-03 De Haan