В этом учебном пособии вы узнаете, как использовать Oracle/PLSQL функцию LAST_VALUE с синтаксисом и примерами.
Описание
Oracle/PLSQL функция LAST_VALUE возвращает последнее значение в упорядоченном наборе значений из аналитического окна. Она похожа на функции FIRST_VALUE и NTH_VALUE.
Синтаксис
Синтаксис Oracle/PLSQL функции LAST_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 | Все строки включены в окно независимо от текущей строки |
Функция LAST_VALUE возвращает последнее значение в упорядоченном наборе значений из аналитического окна.
DDL/DML для примеров
Если вы хотите следовать этому руководству, используйте DDL для создания таблицы employees и DML для заполнения данных. Затем попробуйте примеры в вашей собственной базе данных!
Пример
Рассмотрим некоторые примеры функций Oracle LAST_VALUE и рассмотрим, как использовать функцию LAST_VALUE в Oracle/PLSQL.
Самая высокая зарплата для всех сотрудников
Начнем с простого примера и воспользуйтесь функцией LAST_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 LAST_VALUE(salary) OVER (ORDER BY salary ASC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS "HIGHEST" FROM employees; |
Результат, который вы должны получить:
HIGHEST |
---|
5000 |
В этом примере LAST_VALUE возвращает самое высокое значение salary (зарплаты), указанное LAST_VALUE (salary). Аналитическое окно сортирует данные по зарплате в порядке возрастания, как указано ORDER BY salary ASC. Параметр windowing_clause = RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING используется для обеспечения включения всех строк независимо от текущей строки.
И поскольку мы хотим получить самую высокую зарплату в таблице, нам не нужно было включать query_partition_clause для разделения данных.
Самая высокая зарплата по department_id
Теперь давайте покажем вам, как использовать функцию LAST_VALUE с query_partition_clause. В следующем примере вернем самую высокую зарплату для department_id 10 и 20.
На основе той же таблицы employees введите следующий оператор SQL:
1 2 3 4 5 6 7 |
SELECT DISTINCT department_id, LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary ASC 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 |
В этом примере LAST_VALUE возвращает самое высокое значение salary (зарплаты), указанное LAST_VALUE (salary). Аналитическое окно будет делить результаты на DEPARTMENT_ID и упорядочит данные по salary в порядке возрастания, как указано PARTITION BY DEPARTMENT_ID ORDER BY salary ASC .
Самая низкая зарплата по department_id
Теперь давайте покажем вам, как использовать функцию LAST_VALUE, чтобы вернуть самую низкую зарплату для department_id 10 и 20.
Снова на основе данных в таблице employee введите следующий оператор SQL:
1 2 3 4 5 6 7 |
SELECT DISTINCT department_id, LAST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary DESC 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 DESC , и теперь мы получаем самую низкую зарплату, основанную на DEPARTMENT_ID.