В этом учебном пособии вы узнаете, как использовать Oracle/PLSQL функцию MAX с синтаксисом и примерами.
Описание
Oracle/PLSQL функция MAX возвращает максимальное значение выражения.
Синтаксис
Синтаксис Oracle/PLSQL функции MAX:
FROM tables
[WHERE conditions];
ИЛИ синтаксис для функции MAX с группировкой результатов по одному или нескольким столбцам:
MAX(aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, ... expression_n;
Параметры или аргументы
expression1, expression2, ... expression_n - выражения, которые не инкапсулированы в функцию MAX и должны быть включены в оператор GROUP BY в конце SQL преложения.
aggregate_expression - это столбец или выражение, из которого будет возвращено максимальное значение.
tables - таблицы, из которых вы хотите получить записи. В операторе FROM должна быть указана хотя бы одна таблица.
WHERE conditions - необязательный. Это условия, которые должны быть соблюдены для выбранных записей.
Применение
Функцию MAX можно использовать в следующих версиях Oracle/PLSQL:
- Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i, Oracle 8i
Пример с единичным полем
Рассмотрим несколько примеров функции MAX и изучим, как использовать функцию MAX в Oracle/PLSQL.
Например, вы, возможно, пожелает узнать, какая максимальная зарплата всех employees (сотрудников).
1 |
SELECT MAX(salary) AS "Highest Salary" FROM employees; |
В этом примере функции MAX, выражение MAX(salary) представлено под псевдоним "Highest Salary". В результате, "Highest Salary" будет отображаться как имя поля, когда возвратится результирующий набор.
Пример - использование GROUP BY
В некоторых случаях, вам необходимо будет использовать группировку GROUP BY с функцией MAX.
Например, вы могли бы использовать функцию MAX, чтобы вернуть название department (отдела) и MAX(salary) (максимальную зарплату отдела).
1 2 3 |
SELECT department, MAX(salary) AS "Highest salary" FROM employees GROUP BY department; |
Поскольку в вашем операторе SELECT указан один столбец, который не инкапсулирован в функции MAX, то вы должны использовать оператор GROUP BY. Поэтому поле department (отдел) должно быть указано в операторе GROUP BY.
Вопросы и ответы
Вопрос:
Я пытаюсь вытащить некоторую информацию из таблицы. Для простоты, скажем таблица (report_history) имеет 4 колонки: user_name, report_job_id, report_name и report_run_date.
Каждый раз, когда выполняется отчет в Oracle, запись фиксируется в таблице, отмечая вышеперечисленную информацию. То, что я пытаюсь сделать, это вытащить из этой таблицы, когда и кем был запущен последний отдельный отчет.
Мой первоначальный запрос:
1 2 3 |
SELECT report_name, MAX(report_run_date) FROM report_history GROUP BY report_name |
работает нормально. Тем не менее, это не дает имя пользователя, запустившего отчет.
Добавление user_name к списку выборки и к оператору GROUP BY возвращает несколько строк для каждого отчета; результаты показывают последнее время, когда каждый человек запускал каждый отчет остается вопросом. (т.е. User1 запускал ОТЧЕТ1 01-Июль-14, User2 запускал ОТЧЕТ1 01-АВГ-14). Я не хочу этого ... Я просто хочу знать, кто запускал определенный отчет и когда последний раз он был запущен.
Есть предложения?
Ответ:
Это все становится немного сложнее. В запросе ниже SQL SELECT вернет результаты, которые вы хотите:
1 2 3 4 5 6 7 8 9 10 |
SELECT rh.user_name, rh.report_name, rh.report_run_date FROM report_history rh, (SELECT MAX(report_run_date) AS maxdate, report_name FROM report_history GROUP BY report_name) maxresults WHERE rh.report_name = maxresults.report_name AND rh.report_run_date= maxresults.maxdate; |
Во-первых, мы присвоим псевдоним rh первому экземпляру таблицы report_history.
Во-вторых, мы включили два компонента в оператор FROM. Первый из них является таблица report_history (псевдоним RH). Второй является подзапрос с псевдонимом maxresults:
1 2 3 |
(SELECT MAX(report_run_date) AS maxdate, report_name FROM report_history GROUP BY report_name) maxresults |
Имеем псевдоним MAX(report_run_date) как maxdate и имеем псевдоним всего результирующего набора как maxresults.
Теперь, когда мы составили этот запрос в пределах нашего FROM, Oracle позволит нам объединить эти результаты нашей исходной таблицы report_history. Таким образом, мы объединили поля report_name и report_run_date таблицы с псевдонимами rh и maxresults. Это позволили нам получить report_name, MAX(report_run_date), а также user_name.