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