Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como posso SELECIONAR a primeira linha com MAX (valor da coluna)?


Por que sua segunda consulta não funciona...
select   Item_No,
         Quantity
from     Rec_details
group by Item_No,
         Quantity
having   Quantity=max(Quantity);

Você está agrupando por Item_No e Quantity e o Item_No parece ser a chave primária e conter valores exclusivos, portanto, cada grupo conterá apenas uma linha. O HAVING cláusula procura dentro do grupo para verificar se o valor de quantity é o valor máximo dentro desse grupo, mas há apenas um valor dentro do grupo, então isso sempre será verdade. Sua consulta é o equivalente a:
SELECT DISTINCT
       Item_No,
       Quantity
FROM   Rec_details;

Algumas outras maneiras de obter o valor máximo:

SQL Fiddle

Configuração do esquema 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;

Consulta 1 - Obtenha uma linha com quantity máxima e mais recente item_no (usando 1 varredura de tabela) :
SELECT MAX( item_no ) KEEP ( DENSE_RANK LAST ORDER BY Quantity ) AS Item_no,
       MAX( Quantity ) AS Quantity
FROM   Rec_Details

Resultados :
| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |

Consulta 2 - Obtenha uma linha com quantity máxima e mais recente item_no (usando 1 varredura de tabela) :
SELECT *
FROM   (
  SELECT *
  FROM   Rec_details
  ORDER BY Quantity DESC, Item_no DESC
)
WHERE ROWNUM = 1

Resultados :
| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |

Consulta 3 - Obtenha todas as linhas com quantity máxima (usando 1 varredura de tabela) :
SELECT Item_no, Quantity
FROM   (
  SELECT r.*,
         RANK() OVER ( ORDER BY Quantity DESC ) AS rnk
  FROM   Rec_details r
)
WHERE rnk = 1

Resultados :
| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |

Consulta 4 - Obtenha todas as linhas com quantity máxima (usando 2 varreduras de tabela) :
SELECT Item_no,
       Quantity
FROM   Rec_Details
WHERE  Quantity = ( SELECT MAX( Quantity ) FROM Rec_Details )

Resultados :
| ITEM_NO | QUANTITY |
|---------|----------|
|   12100 |        8 |