SQL — извлекает связанный первичный ключ и значение MAX (значение) запроса

#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