2015-12-19 11 views
2

Я хочу выбрать только одну строку из таблицы. Эта строка содержит максимальное число в таблице. Я пытался использовать MAX Fun, но это не сработало для меня. Я использую две таблицы, чтобы запустить мой запрос, первый запрос возвращает более одной строкиКак я могу выбрать первую строку с MAX (значение столбца)?

SELECT Rec_No FROM Records WHERE STATUS = 'Record Replaced'; 

select Item_No, Quantity from Rec_details 
group by Item_No, Quantity 
having Quantity=max(Quantity); 

У меня есть проблемы во втором запросе, как я всегда получаю эти записи

Item_No  Quantity 
---------- ---------- 
    12507   1 
    12549   4 
    12100   8 
    12501   2 
    12201   7 
    12509   3 
    12080   1 

Мой ответ должен проверить, записи заменяются из таблицы записей, а затем выберите максимальное количество и Item_no из Rec_Details. В моем случае это должно быть:

Item_No  Quantity 
---------- ---------- 
    12201   7 
+0

Что [Тег: РСУБД] вы используете? – Mureinik

+0

ORACLE SQL Developer –

+0

'WHERE ROWNUM = 1;' – Jonathan

ответ

1

Почему ваш второй запрос не работает ...

select Item_No, 
     Quantity 
from  Rec_details 
group by Item_No, 
     Quantity 
having Quantity=max(Quantity); 

Вы группируя обоими Item_No и Quantity и Item_No, как представляется, первичный ключ и содержит уникальные значения, чтобы каждая группа будет содержать только одну строку , Предложение HAVING выглядит внутри группы, поэтому оно будет проверять, что значение quantity является максимальным значением внутри этой группы, но в группе есть только одно значение, так что это всегда будет true.Ваш запрос эквивалентен:

SELECT DISTINCT 
     Item_No, 
     Quantity 
FROM Rec_details; 

Некоторые другие способы, чтобы получить максимальное значение:

SQL Fiddle

Oracle 11g R2 Настройка схемы:

create table Rec_details (item_no, Quantity) AS 
SELECT 12507,1 FROM DUAL UNION ALL 
SELECT 12549,4 FROM DUAL UNION ALL 
SELECT 12100,8 FROM DUAL UNION ALL 
SELECT 12501,2 FROM DUAL UNION ALL 
SELECT 12201,7 FROM DUAL UNION ALL 
SELECT 12509,3 FROM DUAL UNION ALL 
SELECT 12080,1 FROM DUAL; 

запроса 1 - Получить один ряд с максимальным quantity и последним item_no (используя 1 сканирование таблицы):

SELECT MAX(item_no) KEEP (DENSE_RANK LAST ORDER BY Quantity) AS Item_no, 
     MAX(Quantity) AS Quantity 
FROM Rec_Details 

Results:

| ITEM_NO | QUANTITY | 
|---------|----------| 
| 12100 |  8 | 

Запрос 2 - Получить одну строку с максимальным quantity и последней item_no (используя 1 сканирование таблицы):

SELECT * 
FROM (
    SELECT * 
    FROM Rec_details 
    ORDER BY Quantity DESC, Item_no DESC 
) 
WHERE ROWNUM = 1 

Results:

| ITEM_NO | QUANTITY | 
|---------|----------| 
| 12100 |  8 | 

Запрос 3 - Получить все строки с максимальной quantity (используя 1 сканирование таблицы):

SELECT Item_no, Quantity 
FROM (
    SELECT r.*, 
     RANK() OVER (ORDER BY Quantity DESC) AS rnk 
    FROM Rec_details r 
) 
WHERE rnk = 1 

Results:

| ITEM_NO | QUANTITY | 
|---------|----------| 
| 12100 |  8 | 

Запрос 4 - Получить Л.Л. строки с максимальным (сканирование с использованием 2 таблицы) quantity:

SELECT Item_no, 
     Quantity 
FROM Rec_Details 
WHERE Quantity = (SELECT MAX(Quantity) FROM Rec_Details) 

Results:

| ITEM_NO | QUANTITY | 
|---------|----------| 
| 12100 |  8 | 
+0

Это так полезно. Большое спасибо :) –

-1

Попробуйте

select Item_No, Quantity from Rec_details 
ORDER BY Quantity DESC LIMIT 1; 
+0

Ошибка SQL: ORA-00933: команда SQL не выполнена должным образом 00933. 00000 - «SQL-команда неправильно завершена» –

+0

'LIMIT' недопустим синтаксис в Oracle - в Oracle 12 вы можете использовать «FETCH FIRST ROW ONLY» в соответствии с [ответом Мурейника] (http://stackoverflow.com/a/34375409/1509264). – MT0

1

Один из способов получить максимум в Oracle является использование order by и rownum:

select rd.* 
from (select Item_No, Quantity 
    from Rec_details 
    order by quantity desc 
    ) rd 
where rownum = 1; 

group by кажется ненужным.

Если имеется несколько строк с таким же количеством, вы также можете сделать:

select rd.* 
from rec_details rd 
where rd.quantity = (select max(quantity) from rec_details); 
+0

Ваш метод сработал! Спасибо, но как я могу изменить свой другой запрос? –

0

использование

select item_no, quantity from rec_details where quantity = (select max(quantity) from rec_details);

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

+0

Ошибка SQL: ORA-00923: FROM ключевое слово не найдено, где ожидалось –

+0

Подождите. Я забыл использовать 'top'. Необходимо проверить использование 'top'. Подождите до этого. – MASh

+0

'top' не работает в Oracle. – sstan

1

Oracle 12, наконец, представил выборки пункт, так что это может быть сделано довольно элегантно:

SELECT Item_No, Quantity 
FROM  Rec_details 
ORDER BY 2 DESC 
FETCH FIRST ROW ONLY 
+0

Зачем включать предложение GROUP BY? Несомненно, он будет работать так же хорошо без него? – MT0

+0

@ MT0 да, конечно. Я не знаю, что я думаю. Скопировать-вставить ошибку из OP, скорее всего. Исправлена. – Mureinik

-1

MySQL Синтаксис

SELECT Item_No, Quantity FROM Rec_details ORDER BY Item_no DESC, Quantity DESC LIMIT 1 

SQL Server/MS Access Синтаксис

SELECT TOP 1 Item_No, Quantity FROM Rec_details ORDER BY Item_no DESC, Quantity DESC 

Oracle Синтаксис

SELECT Item_No, Quantity FROM Rec_details WHERE ROWNUM <=1 ORDER BY Item_no DESC, Quantity DESC 
+1

Версия Oracle неверна - с помощью 'ROWNUM = 1' в одном запросе будет выбрана одна строка и **, тогда ** будет выполнять упорядочение; он не будет делать это наоборот и выполнит упорядочение, а затем возьмет первую (максимальную) строку. – MT0

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