2016-10-24 3 views
-1

У меня есть таблица с идентификаторами столбцов, FIELD1, FIELD2, всего типа NUMBER.Выберите max из вычисленного столбца рядом с другими столбцами

Я хочу найти MAX функции на FIELD1 и FIELD2 и отобразить ее рядом с идентификатором.

Стараюсь

SELECT ID, MAX(SQRT(FIELD1 + FIELD2)) AS CALC 
FROM TABLE; 

Но она возвращает ORA-00937: not a single-group group function.

Я пробовал решения в this thread, но у них есть свои ошибки.

SELECT * FROM (
    SELECT ID, SQRT(FIELD1 + FIELD2) AS CALC, 
    RANK() OVER (ORDER BY CALC DESC) AS RANKING 
    FROM TABLE 
) 
WHERE RANKING = 1; 

дает ошибку

ORA-06553: PLS-306: wrong number or types of arguments in call to 
'OGC_CALC' 

и так делает

SELECT ID, SQRT(FIELD1 + FIELD2) AS CALC 
FROM TABLE 
WHERE CALC = (
    SELECT MAX(CALC) 
    FROM TABLE 
); 

Использование Oracle Database 11g Express Edition Release 11.2.0.2.0.

Как я могу заставить это работать? Благодарю.

ответ

1

Можете ли вы попробовать следующие два запроса.

SELECT ID,FIELD1,FIELD2,SQRT(FIELD1 + FIELD2) AS CALC 
FROM TABLE WHERE SQRT(FIELD1 + FIELD2)= (SELECT MAX(SQRT(FIELD1 + FIELD2)) FROM TABLE); 

Или Предложил Aleksej без использования агрегата или группы по функциям.

SELECT * 
FROM (
     SELECT ID, 
       SQRT(FIELD1 + FIELD2) 
     FROM TABLE 
     ORDER BY 2 DESC 
     ) 
    WHERE ROWNUM=1; 

Первоначальный запрос,

SELECT * 
FROM (
    SELECT ID, 
      MAX(SQRT(FIELD1 + FIELD2)) AS CALC 
    FROM TABLE 
    GROUP BY ID 
    ORDER BY 2 DESC 
    ) 
WHERE ROWNUM=1; 
+0

К сожалению, извините. Я написал этот второй пример неправильно. Это должен был быть SELECT ID, MAX (SQRT (FIELD1 + FIELD2) AS CALC. Но в любом случае, нет, ваш ответ не тот, который я ищу. Я хочу, чтобы возвращался результат * single *, самый высокий из таблицы GROUP BY в вашем примере выводит сотни результатов. –

+0

Обе эти функции блестяще. Спасибо. –

+0

@JimCullen - Обратите внимание, что эти запросы выполняют разные вещи, например, первая может возвращать более одной строки, вторая - не может – Aleksej

0

Если вам нужно одно значение, с максимальным sqrt(field1+field2) среди всех значений ID, эти два возможных пути:

select * 
from (
     select * 
     from yourTable 
     order by sqrt(field1 + field2) desc 
    ) 
where rownum = 1   

select id, field1, field2 
from (
     select t.*, 
       row_number() over (order by sqrt(field1 + field2) desc) as rn 
     from yourTable t 
    ) 
where rn = 1 

Обратите внимание, что если у вас более одного ID с одинаковым максимальным значением, это будет выбирать один из них случайным образом.

 Смежные вопросы

  • Нет связанных вопросов^_^