2016-09-24 2 views
-1

У меня есть 2 колонки. CustNo и CustBalВыбор наивысшего значения без использования max?

Пытается написать сценарий, чтобы выбрать CustNo с самым высоким балансом. Я попытался использовать max, и я могу заставить его работать, если я просто использую столбец CustBal, но не в этом случае. Я думаю, что это может быть предмет WHERE с чем-то после CUSTBAL?

SELECT CUSTNO, CUSTBAL 
FROM CUSTOMER 
WHERE CUSTBAL 
+0

Я приближаюсь. Теперь у меня самый высокий баланс, но он не включает CustNo ВЫБЕРИТЕ КАЛЬКУ, НАЗАД ОТ КЛИЕНТА; SELECT MAX (CustBal) ОТ ЗАКАЗЧИКА –

+0

Добавить пример данных и ожидаемый результат –

+0

Терминология: вы пытаетесь написать запрос. Не все, что вы пишете, это «сценарий». – mathguy

ответ

1

Почему без использования MAX?

Вам необходимо вычислить MAX отдельно, поскольку вы можете сделать это только в конце запроса (используя агрегатную функцию MAX в предложении SELECT), и вы не можете смешивать отдельные строки и агрегаты в одном запросе. Поэтому вы должны вычислить MAX в подзапросе.

select custno, custbal 
from customer 
where custbal = (select max(custbal) from customer) 
; 
+0

Спасибо! Вот так! С самого начала я злоупотреблял макс. –

+0

По правде говоря, вы можете смешивать отдельные строки и ANALYTIC-функции в одном запросе, но в этом случае вам все равно потребуется «внешний» запрос, чтобы выбрать нужную строку. И в момент, когда вы учитесь, аналитические функции все еще находятся на расстоянии нескольких месяцев (возможно). Просто напишите это для дальнейшего использования! – mathguy

3

альтернативно:

select * from 
(select custno, custbal from customer order by custbal desc) 
where rownum = 1 

..ела у вас есть 12с:

select custno, custbal from customer 
order by custbal desc 
fetch next 1 rows only 

однако они будут возвращать только одну строку, даже если есть несколько клиентов, с тем же самим высоким балансом. если вы хотите, чтобы все записи с наивысшим custbal, то:

select custno, custbal from 
(select *, dense_rank() over (order by custbal desc) as rank from customer) 
where rank = 1 
0


Hi Nicky,
Вы также можете использовать простую группу по функциям,

SELECT CUSTNO, MAX(CUSTBAL) 
    FROM CUSTOMER 
     GROUP BY CUSTNO 
     ORDER BY CUSTNO 

GROUP BY - предоставляет Вам максимум CUSTBAL с по отношению к CUSTNO
ORDER BY - отображает результат в порядке возрастания столбца CUSTNO

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