#sql #oracle #max #aggregate-functions #greatest-n-per-group
#sql #Oracle #max #агрегатные функции #наибольшее-n-на-группу
Вопрос:
У меня проблема с SQL в отношении выбора максимального значения в таблице / запросе. Я пытаюсь вернуть максимальное значение, возвращаемое из агрегированного выражения, а также связанный первичный ключ кортежа.
Я могу вернуть 1 кортеж, отображающий только максимальное значение, когда я включаю только агрегатную функцию в оператор select, но я не могу вернуть только 1 кортеж как с первичным ключом, так и с максимальным значением агрегатного выражения.
Вот пример моего запроса:
SELECT id, MAX(SQRT((POWER((x-(-28)),2) POWER((y-(151)),2)))) as distance
FROM table
GROUP BY id;
Как и следовало ожидать, это возвращает все идентификаторы и связанные значения из функции. Он не возвращает только 1 кортеж с максимальным значением и связанным идентификатором.
Что я могу сделать, чтобы исправить это?
Ответ №1:
Один из способов сделать это — упорядочить по вашему выражению в порядке убывания и выбрать только первую строку:
select id, distance
from (select id, SQRT((POWER((x-(-28)),2) POWER((y-(151)),2))) as distance
from table
order by distance desc)
where rownum < 2
Начиная с Oracle 12c, вы также можете воспользоваться fetch first n rows
синтаксисом для достижения той же цели:
select id, SQRT((POWER((x-(-28)),2) POWER((y-(151)),2))) as distance
from table
order by distance desc
fetch first row only
Если несколько строк имеют одинаковое значение максимального расстояния, вы также можете удобно настроить синтаксис для поддержки связей:
select id, SQRT((POWER((x-(-28)),2) POWER((y-(151)),2))) as distance
from table
order by distance desc
fetch first row with ties