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