В этом учебном пособии вы узнаете, как использовать Oracle/PLSQL функцию FIRST_VALUE с синтаксисом и примерами.
Описание
Oracle/PLSQL функция FIRST_VALUE возвращает первое значение в упорядоченном наборе значений из аналитического окна. Она похожа на функции FIRST_VALUE и NTH_VALUE.
Синтаксис
Синтаксис Oracle/PLSQL функции FIRST_VALUE:
[RESPECT NULLS | IGNORE NULLS]
OVER ([query_partition_clause] [order_by_clause [windowing_clause]])
Следующий синтаксис также является принятым форматом:
OVER ([query_partition_clause] [order_by_clause [windowing_clause]])
Параметры или аргументы
expression Столбец или выражение, для которого вы хотите вернуть первое значение.
RESPECT NULLS | IGNORE NULLS Необязательный. Он определяет, включены ли значения NULL или игнорируются в аналитическом окне. Если этот параметр опущен, значением по умолчанию является RESPECT NULLS, который включает значения NULL.
query_partition_clause Необязательный. Он используется для разделения результатов на группы на основе одного или нескольких выражений.
order_by_clause Необязательный. Он используется для упорядочивания данных в каждом разделе.
windowing_clause Необязательный. Он определяет строки в аналитическом окне для оценки, и важно, чтобы вы использовали правильное окно windowing_clause, или вы можете получить неожиданные результаты. Это может быть значение, такое как:
windowing_clause | Description |
---|---|
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW | Последняя строка в окне изменяется с изменением текущей строки (по умолчанию) |
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING | Первая строка в окне изменяется с изменением текущей строки |
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING | Все строки включены в окно независимо от текущей строки |
- Функция FIRST_VALUE возвращает первое значение, представленное его типом данных.
Применение
Функцию FIRST_VALUE можно использовать в следующих версиях Oracle/PLSQL:
- Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i
DDL / DML для примеров
Если вы хотите следовать этому руководству, используйте DDL для создания таблицы employees и DML для заполнения данных. Затем попробуйте примеры в вашей собственной базе данных!
Пример
Рассмотрим некоторые примеры функций Oracle FIRST_VALUE и рассмотрим, как использовать функцию FIRST_VALUE в Oracle / PLSQL.
Самая высокая зарплата для всех сотрудников
Начнем с простого примера и воспользуйтесь функцией FIRST_VALUE, чтобы вернуть самую высокую зарплату в таблице employees. В этом примере нам не потребуется запрос query_partition_clause, потому что мы оцениваем всю таблицу employees.
В этом примере у нас есть таблица employees со следующими данными:
EMPLOYEE_ID | FIRST_NAME | LAST_NAME | SALARY | DEPARTMENT_ID |
---|---|---|---|---|
100 | Anita | Borg | 2500 | 10 |
200 | Alfred | Aho | 3200 | 10 |
300 | Bill | Gates | 2100 | 10 |
400 | Linus | Torvalds | 3700 | 20 |
500 | Michael | Dell | 3100 | 20 |
600 | Nello | Cristianini | 2950 | 20 |
700 | Rasmus | Lerdorf | 4900 | 20 |
800 | Steve | Jobs | 2600 | 30 |
900 | Thomas | Kyte | 5000 | 30 |
Чтобы найти самую высокую зарплату, введите следующий SELECT:
1 2 3 4 5 |
SELECT DISTINCT FIRST_VALUE(salary) OVER (ORDER BY salary DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS "HIGHEST" FROM employees; |
Результат, который вы должны получить:
HIGHEST |
---|
5000 |
В этом примере FIRST_VALUE возвращает самое высокое значение salary (зарплаты), указанное FIRST_VALUE (salary). Аналитическое окно сортирует данные по зарплате в порядке убывания, как указано ORDER BY salary DESC. Параметр windowing_clause = RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING используется для обеспечения включения всех строк независимо от текущей строки.
И поскольку мы хотим получить самую высокую зарплату в таблице, нам не нужно было включать query_partition_clause для разделения данных.
Самая высокая зарплата по department_id
Теперь давайте покажем вам, как использовать функцию FIRST_VALUE с query_partition_clause. В следующем примере вернем самую высокую зарплату для department_id 10 и 20.
На основе той же таблицы employees введите следующий оператор SQL:
1 2 3 4 5 6 7 |
SELECT DISTINCT department_id, FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS "HIGHEST" FROM employees WHERE department_id in (10,20) ORDER BY department_id; |
Вот результаты, которые вы должны получить:
DEPARTMENT_ID | HIGHEST |
---|---|
10 | 3200 |
20 | 4900 |
В этом примере FIRST_VALUE возвращает самое высокое значение зарплаты, указанное FIRST_VALUE (salary). Аналитическое окно будет делить результаты по DEPARTMENT_ID и упорядочит данные по salary в порядке убывания, как указано PARTITION BY DEPARTMENT_ID ORDER BY зарплата DESC.
Самая низкая зарплата по department_id
Теперь давайте покажем вам, как использовать функцию FIRST_VALUE, чтобы вернуть самую низкую зарплату для department_id 10 и 20.
Снова на основе данных в таблице employee введите следующий оператор SQL:
1 2 3 4 5 6 7 |
SELECT DISTINCT department_id, FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary ASC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS "LOWEST" FROM employees WHERE department_id in (10,20) ORDER BY department_id; |
Вот результаты, которые вы должны получить:
DEPARTMENT_ID | LOWEST |
---|---|
10 | 2100 |
20 | 2950 |
В этом примере мы изменили порядок сортировки на возрастание по разделу, как указано PARTITION BY DEPARTMENT_ID ORDER BY salary ASC, и теперь мы получаем самую низкую зарплату, основанную на DEPARTMENT_ID.